1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * copyright (c) 2001 Fabrice Bellard
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#ifndef AVFORMAT_INTERNAL_H
22cabdff1aSopenharmony_ci#define AVFORMAT_INTERNAL_H
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include <stdint.h>
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci#include "libavcodec/avcodec.h"
27cabdff1aSopenharmony_ci#include "libavcodec/packet_internal.h"
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include "avformat.h"
30cabdff1aSopenharmony_ci#include "os_support.h"
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#define MAX_URL_SIZE 4096
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci/** size of probe buffer, for guessing file type from file contents */
35cabdff1aSopenharmony_ci#define PROBE_BUF_MIN 2048
36cabdff1aSopenharmony_ci#define PROBE_BUF_MAX (1 << 20)
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#ifdef DEBUG
39cabdff1aSopenharmony_ci#    define hex_dump_debug(class, buf, size) av_hex_dump_log(class, AV_LOG_DEBUG, buf, size)
40cabdff1aSopenharmony_ci#else
41cabdff1aSopenharmony_ci#    define hex_dump_debug(class, buf, size) do { if (0) av_hex_dump_log(class, AV_LOG_DEBUG, buf, size); } while(0)
42cabdff1aSopenharmony_ci#endif
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci/**
45cabdff1aSopenharmony_ci * For an AVInputFormat with this flag set read_close() needs to be called
46cabdff1aSopenharmony_ci * by the caller upon read_header() failure.
47cabdff1aSopenharmony_ci */
48cabdff1aSopenharmony_ci#define FF_FMT_INIT_CLEANUP                             (1 << 0)
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_citypedef struct AVCodecTag {
51cabdff1aSopenharmony_ci    enum AVCodecID id;
52cabdff1aSopenharmony_ci    unsigned int tag;
53cabdff1aSopenharmony_ci} AVCodecTag;
54cabdff1aSopenharmony_ci
55cabdff1aSopenharmony_citypedef struct CodecMime{
56cabdff1aSopenharmony_ci    char str[32];
57cabdff1aSopenharmony_ci    enum AVCodecID id;
58cabdff1aSopenharmony_ci} CodecMime;
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci/*************************************************/
61cabdff1aSopenharmony_ci/* fractional numbers for exact pts handling */
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci/**
64cabdff1aSopenharmony_ci * The exact value of the fractional number is: 'val + num / den'.
65cabdff1aSopenharmony_ci * num is assumed to be 0 <= num < den.
66cabdff1aSopenharmony_ci */
67cabdff1aSopenharmony_citypedef struct FFFrac {
68cabdff1aSopenharmony_ci    int64_t val, num, den;
69cabdff1aSopenharmony_ci} FFFrac;
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_citypedef struct FFFormatContext {
73cabdff1aSopenharmony_ci    /**
74cabdff1aSopenharmony_ci     * The public context.
75cabdff1aSopenharmony_ci     */
76cabdff1aSopenharmony_ci    AVFormatContext pub;
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_ci    /**
79cabdff1aSopenharmony_ci     * Number of streams relevant for interleaving.
80cabdff1aSopenharmony_ci     * Muxing only.
81cabdff1aSopenharmony_ci     */
82cabdff1aSopenharmony_ci    int nb_interleaved_streams;
83cabdff1aSopenharmony_ci
84cabdff1aSopenharmony_ci    /**
85cabdff1aSopenharmony_ci     * Whether the timestamp shift offset has already been determined.
86cabdff1aSopenharmony_ci     * -1: disabled, 0: not yet determined, 1: determined.
87cabdff1aSopenharmony_ci     */
88cabdff1aSopenharmony_ci    enum {
89cabdff1aSopenharmony_ci        AVOID_NEGATIVE_TS_DISABLED = -1,
90cabdff1aSopenharmony_ci        AVOID_NEGATIVE_TS_UNKNOWN  = 0,
91cabdff1aSopenharmony_ci        AVOID_NEGATIVE_TS_KNOWN    = 1,
92cabdff1aSopenharmony_ci    } avoid_negative_ts_status;
93cabdff1aSopenharmony_ci#define AVOID_NEGATIVE_TS_ENABLED(status) ((status) >= 0)
94cabdff1aSopenharmony_ci
95cabdff1aSopenharmony_ci    /**
96cabdff1aSopenharmony_ci     * The interleavement function in use. Always set for muxers.
97cabdff1aSopenharmony_ci     */
98cabdff1aSopenharmony_ci    int (*interleave_packet)(struct AVFormatContext *s, AVPacket *pkt,
99cabdff1aSopenharmony_ci                             int flush, int has_packet);
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci    /**
102cabdff1aSopenharmony_ci     * This buffer is only needed when packets were already buffered but
103cabdff1aSopenharmony_ci     * not decoded, for example to get the codec parameters in MPEG
104cabdff1aSopenharmony_ci     * streams.
105cabdff1aSopenharmony_ci     */
106cabdff1aSopenharmony_ci    PacketList packet_buffer;
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci    /* av_seek_frame() support */
109cabdff1aSopenharmony_ci    int64_t data_offset; /**< offset of the first packet */
110cabdff1aSopenharmony_ci
111cabdff1aSopenharmony_ci    /**
112cabdff1aSopenharmony_ci     * Raw packets from the demuxer, prior to parsing and decoding.
113cabdff1aSopenharmony_ci     * This buffer is used for buffering packets until the codec can
114cabdff1aSopenharmony_ci     * be identified, as parsing cannot be done without knowing the
115cabdff1aSopenharmony_ci     * codec.
116cabdff1aSopenharmony_ci     */
117cabdff1aSopenharmony_ci    PacketList raw_packet_buffer;
118cabdff1aSopenharmony_ci    /**
119cabdff1aSopenharmony_ci     * Packets split by the parser get queued here.
120cabdff1aSopenharmony_ci     */
121cabdff1aSopenharmony_ci    PacketList parse_queue;
122cabdff1aSopenharmony_ci    /**
123cabdff1aSopenharmony_ci     * The generic code uses this as a temporary packet
124cabdff1aSopenharmony_ci     * to parse packets or for muxing, especially flushing.
125cabdff1aSopenharmony_ci     * For demuxers, it may also be used for other means
126cabdff1aSopenharmony_ci     * for short periods that are guaranteed not to overlap
127cabdff1aSopenharmony_ci     * with calls to av_read_frame() (or ff_read_packet())
128cabdff1aSopenharmony_ci     * or with each other.
129cabdff1aSopenharmony_ci     * It may be used by demuxers as a replacement for
130cabdff1aSopenharmony_ci     * stack packets (unless they call one of the aforementioned
131cabdff1aSopenharmony_ci     * functions with their own AVFormatContext).
132cabdff1aSopenharmony_ci     * Every user has to ensure that this packet is blank
133cabdff1aSopenharmony_ci     * after using it.
134cabdff1aSopenharmony_ci     */
135cabdff1aSopenharmony_ci    AVPacket *parse_pkt;
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_ci    /**
138cabdff1aSopenharmony_ci     * Used to hold temporary packets for the generic demuxing code.
139cabdff1aSopenharmony_ci     * When muxing, it may be used by muxers to hold packets (even
140cabdff1aSopenharmony_ci     * permanent ones).
141cabdff1aSopenharmony_ci     */
142cabdff1aSopenharmony_ci    AVPacket *pkt;
143cabdff1aSopenharmony_ci    /**
144cabdff1aSopenharmony_ci     * Sum of the size of packets in raw_packet_buffer, in bytes.
145cabdff1aSopenharmony_ci     */
146cabdff1aSopenharmony_ci    int raw_packet_buffer_size;
147cabdff1aSopenharmony_ci
148cabdff1aSopenharmony_ci#if FF_API_COMPUTE_PKT_FIELDS2
149cabdff1aSopenharmony_ci    int missing_ts_warning;
150cabdff1aSopenharmony_ci#endif
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ci    int inject_global_side_data;
153cabdff1aSopenharmony_ci
154cabdff1aSopenharmony_ci    int avoid_negative_ts_use_pts;
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci    /**
157cabdff1aSopenharmony_ci     * Timestamp of the end of the shortest stream.
158cabdff1aSopenharmony_ci     */
159cabdff1aSopenharmony_ci    int64_t shortest_end;
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci    /**
162cabdff1aSopenharmony_ci     * Whether or not avformat_init_output has already been called
163cabdff1aSopenharmony_ci     */
164cabdff1aSopenharmony_ci    int initialized;
165cabdff1aSopenharmony_ci
166cabdff1aSopenharmony_ci    /**
167cabdff1aSopenharmony_ci     * Whether or not avformat_init_output fully initialized streams
168cabdff1aSopenharmony_ci     */
169cabdff1aSopenharmony_ci    int streams_initialized;
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci    /**
172cabdff1aSopenharmony_ci     * ID3v2 tag useful for MP3 demuxing
173cabdff1aSopenharmony_ci     */
174cabdff1aSopenharmony_ci    AVDictionary *id3v2_meta;
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    /*
177cabdff1aSopenharmony_ci     * Prefer the codec framerate for avg_frame_rate computation.
178cabdff1aSopenharmony_ci     */
179cabdff1aSopenharmony_ci    int prefer_codec_framerate;
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci    /**
182cabdff1aSopenharmony_ci     * Set if chapter ids are strictly monotonic.
183cabdff1aSopenharmony_ci     */
184cabdff1aSopenharmony_ci    int chapter_ids_monotonic;
185cabdff1aSopenharmony_ci
186cabdff1aSopenharmony_ci    /**
187cabdff1aSopenharmony_ci     * Contexts and child contexts do not contain a metadata option
188cabdff1aSopenharmony_ci     */
189cabdff1aSopenharmony_ci    int metafree;
190cabdff1aSopenharmony_ci} FFFormatContext;
191cabdff1aSopenharmony_ci
192cabdff1aSopenharmony_cistatic av_always_inline FFFormatContext *ffformatcontext(AVFormatContext *s)
193cabdff1aSopenharmony_ci{
194cabdff1aSopenharmony_ci    return (FFFormatContext*)s;
195cabdff1aSopenharmony_ci}
196cabdff1aSopenharmony_ci
197cabdff1aSopenharmony_citypedef struct FFStream {
198cabdff1aSopenharmony_ci    /**
199cabdff1aSopenharmony_ci     * The public context.
200cabdff1aSopenharmony_ci     */
201cabdff1aSopenharmony_ci    AVStream pub;
202cabdff1aSopenharmony_ci
203cabdff1aSopenharmony_ci    /**
204cabdff1aSopenharmony_ci     * Set to 1 if the codec allows reordering, so pts can be different
205cabdff1aSopenharmony_ci     * from dts.
206cabdff1aSopenharmony_ci     */
207cabdff1aSopenharmony_ci    int reorder;
208cabdff1aSopenharmony_ci
209cabdff1aSopenharmony_ci    /**
210cabdff1aSopenharmony_ci     * bitstream filter to run on stream
211cabdff1aSopenharmony_ci     * - encoding: Set by muxer using ff_stream_add_bitstream_filter
212cabdff1aSopenharmony_ci     * - decoding: unused
213cabdff1aSopenharmony_ci     */
214cabdff1aSopenharmony_ci    struct AVBSFContext *bsfc;
215cabdff1aSopenharmony_ci
216cabdff1aSopenharmony_ci    /**
217cabdff1aSopenharmony_ci     * Whether or not check_bitstream should still be run on each packet
218cabdff1aSopenharmony_ci     */
219cabdff1aSopenharmony_ci    int bitstream_checked;
220cabdff1aSopenharmony_ci
221cabdff1aSopenharmony_ci    /**
222cabdff1aSopenharmony_ci     * The codec context used by avformat_find_stream_info, the parser, etc.
223cabdff1aSopenharmony_ci     */
224cabdff1aSopenharmony_ci    AVCodecContext *avctx;
225cabdff1aSopenharmony_ci    /**
226cabdff1aSopenharmony_ci     * 1 if avctx has been initialized with the values from the codec parameters
227cabdff1aSopenharmony_ci     */
228cabdff1aSopenharmony_ci    int avctx_inited;
229cabdff1aSopenharmony_ci
230cabdff1aSopenharmony_ci    /* the context for extracting extradata in find_stream_info()
231cabdff1aSopenharmony_ci     * inited=1/bsf=NULL signals that extracting is not possible (codec not
232cabdff1aSopenharmony_ci     * supported) */
233cabdff1aSopenharmony_ci    struct {
234cabdff1aSopenharmony_ci        struct AVBSFContext *bsf;
235cabdff1aSopenharmony_ci        int inited;
236cabdff1aSopenharmony_ci    } extract_extradata;
237cabdff1aSopenharmony_ci
238cabdff1aSopenharmony_ci    /**
239cabdff1aSopenharmony_ci     * Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
240cabdff1aSopenharmony_ci     */
241cabdff1aSopenharmony_ci    int need_context_update;
242cabdff1aSopenharmony_ci
243cabdff1aSopenharmony_ci    int is_intra_only;
244cabdff1aSopenharmony_ci
245cabdff1aSopenharmony_ci    FFFrac *priv_pts;
246cabdff1aSopenharmony_ci
247cabdff1aSopenharmony_ci    /**
248cabdff1aSopenharmony_ci     * Stream information used internally by avformat_find_stream_info()
249cabdff1aSopenharmony_ci     */
250cabdff1aSopenharmony_ci    struct FFStreamInfo *info;
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci    AVIndexEntry *index_entries; /**< Only used if the format does not
253cabdff1aSopenharmony_ci                                    support seeking natively. */
254cabdff1aSopenharmony_ci    int nb_index_entries;
255cabdff1aSopenharmony_ci    unsigned int index_entries_allocated_size;
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci    int64_t interleaver_chunk_size;
258cabdff1aSopenharmony_ci    int64_t interleaver_chunk_duration;
259cabdff1aSopenharmony_ci
260cabdff1aSopenharmony_ci    /**
261cabdff1aSopenharmony_ci     * stream probing state
262cabdff1aSopenharmony_ci     * -1   -> probing finished
263cabdff1aSopenharmony_ci     *  0   -> no probing requested
264cabdff1aSopenharmony_ci     * rest -> perform probing with request_probe being the minimum score to accept.
265cabdff1aSopenharmony_ci     */
266cabdff1aSopenharmony_ci    int request_probe;
267cabdff1aSopenharmony_ci    /**
268cabdff1aSopenharmony_ci     * Indicates that everything up to the next keyframe
269cabdff1aSopenharmony_ci     * should be discarded.
270cabdff1aSopenharmony_ci     */
271cabdff1aSopenharmony_ci    int skip_to_keyframe;
272cabdff1aSopenharmony_ci
273cabdff1aSopenharmony_ci    /**
274cabdff1aSopenharmony_ci     * Number of samples to skip at the start of the frame decoded from the next packet.
275cabdff1aSopenharmony_ci     */
276cabdff1aSopenharmony_ci    int skip_samples;
277cabdff1aSopenharmony_ci
278cabdff1aSopenharmony_ci    /**
279cabdff1aSopenharmony_ci     * If not 0, the number of samples that should be skipped from the start of
280cabdff1aSopenharmony_ci     * the stream (the samples are removed from packets with pts==0, which also
281cabdff1aSopenharmony_ci     * assumes negative timestamps do not happen).
282cabdff1aSopenharmony_ci     * Intended for use with formats such as mp3 with ad-hoc gapless audio
283cabdff1aSopenharmony_ci     * support.
284cabdff1aSopenharmony_ci     */
285cabdff1aSopenharmony_ci    int64_t start_skip_samples;
286cabdff1aSopenharmony_ci
287cabdff1aSopenharmony_ci    /**
288cabdff1aSopenharmony_ci     * If not 0, the first audio sample that should be discarded from the stream.
289cabdff1aSopenharmony_ci     * This is broken by design (needs global sample count), but can't be
290cabdff1aSopenharmony_ci     * avoided for broken by design formats such as mp3 with ad-hoc gapless
291cabdff1aSopenharmony_ci     * audio support.
292cabdff1aSopenharmony_ci     */
293cabdff1aSopenharmony_ci    int64_t first_discard_sample;
294cabdff1aSopenharmony_ci
295cabdff1aSopenharmony_ci    /**
296cabdff1aSopenharmony_ci     * The sample after last sample that is intended to be discarded after
297cabdff1aSopenharmony_ci     * first_discard_sample. Works on frame boundaries only. Used to prevent
298cabdff1aSopenharmony_ci     * early EOF if the gapless info is broken (considered concatenated mp3s).
299cabdff1aSopenharmony_ci     */
300cabdff1aSopenharmony_ci    int64_t last_discard_sample;
301cabdff1aSopenharmony_ci
302cabdff1aSopenharmony_ci    /**
303cabdff1aSopenharmony_ci     * Number of internally decoded frames, used internally in libavformat, do not access
304cabdff1aSopenharmony_ci     * its lifetime differs from info which is why it is not in that structure.
305cabdff1aSopenharmony_ci     */
306cabdff1aSopenharmony_ci    int nb_decoded_frames;
307cabdff1aSopenharmony_ci
308cabdff1aSopenharmony_ci    /**
309cabdff1aSopenharmony_ci     * Timestamp offset added to timestamps before muxing
310cabdff1aSopenharmony_ci     */
311cabdff1aSopenharmony_ci    int64_t mux_ts_offset;
312cabdff1aSopenharmony_ci
313cabdff1aSopenharmony_ci    /**
314cabdff1aSopenharmony_ci     * Internal data to check for wrapping of the time stamp
315cabdff1aSopenharmony_ci     */
316cabdff1aSopenharmony_ci    int64_t pts_wrap_reference;
317cabdff1aSopenharmony_ci
318cabdff1aSopenharmony_ci    /**
319cabdff1aSopenharmony_ci     * Options for behavior, when a wrap is detected.
320cabdff1aSopenharmony_ci     *
321cabdff1aSopenharmony_ci     * Defined by AV_PTS_WRAP_ values.
322cabdff1aSopenharmony_ci     *
323cabdff1aSopenharmony_ci     * If correction is enabled, there are two possibilities:
324cabdff1aSopenharmony_ci     * If the first time stamp is near the wrap point, the wrap offset
325cabdff1aSopenharmony_ci     * will be subtracted, which will create negative time stamps.
326cabdff1aSopenharmony_ci     * Otherwise the offset will be added.
327cabdff1aSopenharmony_ci     */
328cabdff1aSopenharmony_ci    int pts_wrap_behavior;
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_ci    /**
331cabdff1aSopenharmony_ci     * Internal data to prevent doing update_initial_durations() twice
332cabdff1aSopenharmony_ci     */
333cabdff1aSopenharmony_ci    int update_initial_durations_done;
334cabdff1aSopenharmony_ci
335cabdff1aSopenharmony_ci#define MAX_REORDER_DELAY 16
336cabdff1aSopenharmony_ci
337cabdff1aSopenharmony_ci    /**
338cabdff1aSopenharmony_ci     * Internal data to generate dts from pts
339cabdff1aSopenharmony_ci     */
340cabdff1aSopenharmony_ci    int64_t pts_reorder_error[MAX_REORDER_DELAY+1];
341cabdff1aSopenharmony_ci    uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1];
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci    int64_t pts_buffer[MAX_REORDER_DELAY+1];
344cabdff1aSopenharmony_ci
345cabdff1aSopenharmony_ci    /**
346cabdff1aSopenharmony_ci     * Internal data to analyze DTS and detect faulty mpeg streams
347cabdff1aSopenharmony_ci     */
348cabdff1aSopenharmony_ci    int64_t last_dts_for_order_check;
349cabdff1aSopenharmony_ci    uint8_t dts_ordered;
350cabdff1aSopenharmony_ci    uint8_t dts_misordered;
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ci    /**
353cabdff1aSopenharmony_ci     * Internal data to inject global side data
354cabdff1aSopenharmony_ci     */
355cabdff1aSopenharmony_ci    int inject_global_side_data;
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci    /**
358cabdff1aSopenharmony_ci     * display aspect ratio (0 if unknown)
359cabdff1aSopenharmony_ci     * - encoding: unused
360cabdff1aSopenharmony_ci     * - decoding: Set by libavformat to calculate sample_aspect_ratio internally
361cabdff1aSopenharmony_ci     */
362cabdff1aSopenharmony_ci    AVRational display_aspect_ratio;
363cabdff1aSopenharmony_ci
364cabdff1aSopenharmony_ci    AVProbeData probe_data;
365cabdff1aSopenharmony_ci
366cabdff1aSopenharmony_ci    /**
367cabdff1aSopenharmony_ci     * last packet in packet_buffer for this stream when muxing.
368cabdff1aSopenharmony_ci     */
369cabdff1aSopenharmony_ci    PacketListEntry *last_in_packet_buffer;
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci    int64_t last_IP_pts;
372cabdff1aSopenharmony_ci    int last_IP_duration;
373cabdff1aSopenharmony_ci
374cabdff1aSopenharmony_ci    /**
375cabdff1aSopenharmony_ci     * Number of packets to buffer for codec probing
376cabdff1aSopenharmony_ci     */
377cabdff1aSopenharmony_ci    int probe_packets;
378cabdff1aSopenharmony_ci
379cabdff1aSopenharmony_ci    /* av_read_frame() support */
380cabdff1aSopenharmony_ci    enum AVStreamParseType need_parsing;
381cabdff1aSopenharmony_ci    struct AVCodecParserContext *parser;
382cabdff1aSopenharmony_ci
383cabdff1aSopenharmony_ci    /**
384cabdff1aSopenharmony_ci     * Number of frames that have been demuxed during avformat_find_stream_info()
385cabdff1aSopenharmony_ci     */
386cabdff1aSopenharmony_ci    int codec_info_nb_frames;
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_ci    /**
389cabdff1aSopenharmony_ci     * Stream Identifier
390cabdff1aSopenharmony_ci     * This is the MPEG-TS stream identifier +1
391cabdff1aSopenharmony_ci     * 0 means unknown
392cabdff1aSopenharmony_ci     */
393cabdff1aSopenharmony_ci    int stream_identifier;
394cabdff1aSopenharmony_ci
395cabdff1aSopenharmony_ci    // Timestamp generation support:
396cabdff1aSopenharmony_ci    /**
397cabdff1aSopenharmony_ci     * Timestamp corresponding to the last dts sync point.
398cabdff1aSopenharmony_ci     *
399cabdff1aSopenharmony_ci     * Initialized when AVCodecParserContext.dts_sync_point >= 0 and
400cabdff1aSopenharmony_ci     * a DTS is received from the underlying container. Otherwise set to
401cabdff1aSopenharmony_ci     * AV_NOPTS_VALUE by default.
402cabdff1aSopenharmony_ci     */
403cabdff1aSopenharmony_ci    int64_t first_dts;
404cabdff1aSopenharmony_ci    int64_t cur_dts;
405cabdff1aSopenharmony_ci} FFStream;
406cabdff1aSopenharmony_ci
407cabdff1aSopenharmony_cistatic av_always_inline FFStream *ffstream(AVStream *st)
408cabdff1aSopenharmony_ci{
409cabdff1aSopenharmony_ci    return (FFStream*)st;
410cabdff1aSopenharmony_ci}
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_cistatic av_always_inline const FFStream *cffstream(const AVStream *st)
413cabdff1aSopenharmony_ci{
414cabdff1aSopenharmony_ci    return (FFStream*)st;
415cabdff1aSopenharmony_ci}
416cabdff1aSopenharmony_ci
417cabdff1aSopenharmony_ci#ifdef __GNUC__
418cabdff1aSopenharmony_ci#define dynarray_add(tab, nb_ptr, elem)\
419cabdff1aSopenharmony_cido {\
420cabdff1aSopenharmony_ci    __typeof__(tab) _tab = (tab);\
421cabdff1aSopenharmony_ci    __typeof__(elem) _elem = (elem);\
422cabdff1aSopenharmony_ci    (void)sizeof(**_tab == _elem); /* check that types are compatible */\
423cabdff1aSopenharmony_ci    av_dynarray_add(_tab, nb_ptr, _elem);\
424cabdff1aSopenharmony_ci} while(0)
425cabdff1aSopenharmony_ci#else
426cabdff1aSopenharmony_ci#define dynarray_add(tab, nb_ptr, elem)\
427cabdff1aSopenharmony_cido {\
428cabdff1aSopenharmony_ci    av_dynarray_add((tab), nb_ptr, (elem));\
429cabdff1aSopenharmony_ci} while(0)
430cabdff1aSopenharmony_ci#endif
431cabdff1aSopenharmony_ci
432cabdff1aSopenharmony_ci
433cabdff1aSopenharmony_civoid ff_flush_packet_queue(AVFormatContext *s);
434cabdff1aSopenharmony_ci
435cabdff1aSopenharmony_ci/**
436cabdff1aSopenharmony_ci * Automatically create sub-directories
437cabdff1aSopenharmony_ci *
438cabdff1aSopenharmony_ci * @param path will create sub-directories by path
439cabdff1aSopenharmony_ci * @return 0, or < 0 on error
440cabdff1aSopenharmony_ci */
441cabdff1aSopenharmony_ciint ff_mkdir_p(const char *path);
442cabdff1aSopenharmony_ci
443cabdff1aSopenharmony_ci/**
444cabdff1aSopenharmony_ci * Write hexadecimal string corresponding to given binary data. The string
445cabdff1aSopenharmony_ci * is zero-terminated.
446cabdff1aSopenharmony_ci *
447cabdff1aSopenharmony_ci * @param buf       the output string is written here;
448cabdff1aSopenharmony_ci *                  needs to be at least 2 * size + 1 bytes long.
449cabdff1aSopenharmony_ci * @param src       the input data to be transformed.
450cabdff1aSopenharmony_ci * @param size      the size (in byte) of src.
451cabdff1aSopenharmony_ci * @param lowercase determines whether to use the range [0-9a-f] or [0-9A-F].
452cabdff1aSopenharmony_ci * @return buf.
453cabdff1aSopenharmony_ci */
454cabdff1aSopenharmony_cichar *ff_data_to_hex(char *buf, const uint8_t *src, int size, int lowercase);
455cabdff1aSopenharmony_ci
456cabdff1aSopenharmony_ci/**
457cabdff1aSopenharmony_ci * Parse a string of hexadecimal strings. Any space between the hexadecimal
458cabdff1aSopenharmony_ci * digits is ignored.
459cabdff1aSopenharmony_ci *
460cabdff1aSopenharmony_ci * @param data if non-null, the parsed data is written to this pointer
461cabdff1aSopenharmony_ci * @param p the string to parse
462cabdff1aSopenharmony_ci * @return the number of bytes written (or to be written, if data is null)
463cabdff1aSopenharmony_ci */
464cabdff1aSopenharmony_ciint ff_hex_to_data(uint8_t *data, const char *p);
465cabdff1aSopenharmony_ci
466cabdff1aSopenharmony_ci#define NTP_OFFSET 2208988800ULL
467cabdff1aSopenharmony_ci#define NTP_OFFSET_US (NTP_OFFSET * 1000000ULL)
468cabdff1aSopenharmony_ci
469cabdff1aSopenharmony_ci/** Get the current time since NTP epoch in microseconds. */
470cabdff1aSopenharmony_ciuint64_t ff_ntp_time(void);
471cabdff1aSopenharmony_ci
472cabdff1aSopenharmony_ci/**
473cabdff1aSopenharmony_ci * Get the NTP time stamp formatted as per the RFC-5905.
474cabdff1aSopenharmony_ci *
475cabdff1aSopenharmony_ci * @param ntp_time NTP time in micro seconds (since NTP epoch)
476cabdff1aSopenharmony_ci * @return the formatted NTP time stamp
477cabdff1aSopenharmony_ci */
478cabdff1aSopenharmony_ciuint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us);
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci/**
481cabdff1aSopenharmony_ci * Parse the NTP time in micro seconds (since NTP epoch).
482cabdff1aSopenharmony_ci *
483cabdff1aSopenharmony_ci * @param ntp_ts NTP time stamp formatted as per the RFC-5905.
484cabdff1aSopenharmony_ci * @return the time in micro seconds (since NTP epoch)
485cabdff1aSopenharmony_ci */
486cabdff1aSopenharmony_ciuint64_t ff_parse_ntp_time(uint64_t ntp_ts);
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci/**
489cabdff1aSopenharmony_ci * Append the media-specific SDP fragment for the media stream c
490cabdff1aSopenharmony_ci * to the buffer buff.
491cabdff1aSopenharmony_ci *
492cabdff1aSopenharmony_ci * Note, the buffer needs to be initialized, since it is appended to
493cabdff1aSopenharmony_ci * existing content.
494cabdff1aSopenharmony_ci *
495cabdff1aSopenharmony_ci * @param buff the buffer to append the SDP fragment to
496cabdff1aSopenharmony_ci * @param size the size of the buff buffer
497cabdff1aSopenharmony_ci * @param st the AVStream of the media to describe
498cabdff1aSopenharmony_ci * @param idx the global stream index
499cabdff1aSopenharmony_ci * @param dest_addr the destination address of the media stream, may be NULL
500cabdff1aSopenharmony_ci * @param dest_type the destination address type, may be NULL
501cabdff1aSopenharmony_ci * @param port the destination port of the media stream, 0 if unknown
502cabdff1aSopenharmony_ci * @param ttl the time to live of the stream, 0 if not multicast
503cabdff1aSopenharmony_ci * @param fmt the AVFormatContext, which might contain options modifying
504cabdff1aSopenharmony_ci *            the generated SDP
505cabdff1aSopenharmony_ci * @return 0 on success, a negative error code on failure
506cabdff1aSopenharmony_ci */
507cabdff1aSopenharmony_ciint ff_sdp_write_media(char *buff, int size, const AVStream *st, int idx,
508cabdff1aSopenharmony_ci                       const char *dest_addr, const char *dest_type,
509cabdff1aSopenharmony_ci                       int port, int ttl, AVFormatContext *fmt);
510cabdff1aSopenharmony_ci
511cabdff1aSopenharmony_ci/**
512cabdff1aSopenharmony_ci * Read a whole line of text from AVIOContext. Stop reading after reaching
513cabdff1aSopenharmony_ci * either a \\n, a \\0 or EOF. The returned string is always \\0-terminated,
514cabdff1aSopenharmony_ci * and may be truncated if the buffer is too small.
515cabdff1aSopenharmony_ci *
516cabdff1aSopenharmony_ci * @param s the read-only AVIOContext
517cabdff1aSopenharmony_ci * @param buf buffer to store the read line
518cabdff1aSopenharmony_ci * @param maxlen size of the buffer
519cabdff1aSopenharmony_ci * @return the length of the string written in the buffer, not including the
520cabdff1aSopenharmony_ci *         final \\0
521cabdff1aSopenharmony_ci */
522cabdff1aSopenharmony_ciint ff_get_line(AVIOContext *s, char *buf, int maxlen);
523cabdff1aSopenharmony_ci
524cabdff1aSopenharmony_ci/**
525cabdff1aSopenharmony_ci * Same as ff_get_line but strip the white-space characters in the text tail
526cabdff1aSopenharmony_ci *
527cabdff1aSopenharmony_ci * @param s the read-only AVIOContext
528cabdff1aSopenharmony_ci * @param buf buffer to store the read line
529cabdff1aSopenharmony_ci * @param maxlen size of the buffer
530cabdff1aSopenharmony_ci * @return the length of the string written in the buffer
531cabdff1aSopenharmony_ci */
532cabdff1aSopenharmony_ciint ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen);
533cabdff1aSopenharmony_ci
534cabdff1aSopenharmony_ci#define SPACE_CHARS " \t\r\n"
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ci/**
537cabdff1aSopenharmony_ci * Callback function type for ff_parse_key_value.
538cabdff1aSopenharmony_ci *
539cabdff1aSopenharmony_ci * @param key a pointer to the key
540cabdff1aSopenharmony_ci * @param key_len the number of bytes that belong to the key, including the '='
541cabdff1aSopenharmony_ci *                char
542cabdff1aSopenharmony_ci * @param dest return the destination pointer for the value in *dest, may
543cabdff1aSopenharmony_ci *             be null to ignore the value
544cabdff1aSopenharmony_ci * @param dest_len the length of the *dest buffer
545cabdff1aSopenharmony_ci */
546cabdff1aSopenharmony_citypedef void (*ff_parse_key_val_cb)(void *context, const char *key,
547cabdff1aSopenharmony_ci                                    int key_len, char **dest, int *dest_len);
548cabdff1aSopenharmony_ci/**
549cabdff1aSopenharmony_ci * Parse a string with comma-separated key=value pairs. The value strings
550cabdff1aSopenharmony_ci * may be quoted and may contain escaped characters within quoted strings.
551cabdff1aSopenharmony_ci *
552cabdff1aSopenharmony_ci * @param str the string to parse
553cabdff1aSopenharmony_ci * @param callback_get_buf function that returns where to store the
554cabdff1aSopenharmony_ci *                         unescaped value string.
555cabdff1aSopenharmony_ci * @param context the opaque context pointer to pass to callback_get_buf
556cabdff1aSopenharmony_ci */
557cabdff1aSopenharmony_civoid ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
558cabdff1aSopenharmony_ci                        void *context);
559cabdff1aSopenharmony_ci
560cabdff1aSopenharmony_cienum AVCodecID ff_guess_image2_codec(const char *filename);
561cabdff1aSopenharmony_ci
562cabdff1aSopenharmony_ciconst AVCodec *ff_find_decoder(AVFormatContext *s, const AVStream *st,
563cabdff1aSopenharmony_ci                               enum AVCodecID codec_id);
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci/**
566cabdff1aSopenharmony_ci * Set the time base and wrapping info for a given stream. This will be used
567cabdff1aSopenharmony_ci * to interpret the stream's timestamps. If the new time base is invalid
568cabdff1aSopenharmony_ci * (numerator or denominator are non-positive), it leaves the stream
569cabdff1aSopenharmony_ci * unchanged.
570cabdff1aSopenharmony_ci *
571cabdff1aSopenharmony_ci * @param st stream
572cabdff1aSopenharmony_ci * @param pts_wrap_bits number of bits effectively used by the pts
573cabdff1aSopenharmony_ci *        (used for wrap control)
574cabdff1aSopenharmony_ci * @param pts_num time base numerator
575cabdff1aSopenharmony_ci * @param pts_den time base denominator
576cabdff1aSopenharmony_ci */
577cabdff1aSopenharmony_civoid avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
578cabdff1aSopenharmony_ci                         unsigned int pts_num, unsigned int pts_den);
579cabdff1aSopenharmony_ci
580cabdff1aSopenharmony_ci/**
581cabdff1aSopenharmony_ci * Set the timebase for each stream from the corresponding codec timebase and
582cabdff1aSopenharmony_ci * print it.
583cabdff1aSopenharmony_ci */
584cabdff1aSopenharmony_ciint ff_framehash_write_header(AVFormatContext *s);
585cabdff1aSopenharmony_ci
586cabdff1aSopenharmony_ci/**
587cabdff1aSopenharmony_ci * Frees a stream without modifying the corresponding AVFormatContext.
588cabdff1aSopenharmony_ci * Must only be called if the latter doesn't matter or if the stream
589cabdff1aSopenharmony_ci * is not yet attached to an AVFormatContext.
590cabdff1aSopenharmony_ci */
591cabdff1aSopenharmony_civoid ff_free_stream(AVStream **st);
592cabdff1aSopenharmony_ci/**
593cabdff1aSopenharmony_ci * Remove a stream from its AVFormatContext and free it.
594cabdff1aSopenharmony_ci * The stream must be the last stream of the AVFormatContext.
595cabdff1aSopenharmony_ci */
596cabdff1aSopenharmony_civoid ff_remove_stream(AVFormatContext *s, AVStream *st);
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ciunsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id);
599cabdff1aSopenharmony_ci
600cabdff1aSopenharmony_cienum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag);
601cabdff1aSopenharmony_ci
602cabdff1aSopenharmony_ciint ff_is_intra_only(enum AVCodecID id);
603cabdff1aSopenharmony_ci
604cabdff1aSopenharmony_ci/**
605cabdff1aSopenharmony_ci * Select a PCM codec based on the given parameters.
606cabdff1aSopenharmony_ci *
607cabdff1aSopenharmony_ci * @param bps     bits-per-sample
608cabdff1aSopenharmony_ci * @param flt     floating-point
609cabdff1aSopenharmony_ci * @param be      big-endian
610cabdff1aSopenharmony_ci * @param sflags  signed flags. each bit corresponds to one byte of bit depth.
611cabdff1aSopenharmony_ci *                e.g. the 1st bit indicates if 8-bit should be signed or
612cabdff1aSopenharmony_ci *                unsigned, the 2nd bit indicates if 16-bit should be signed or
613cabdff1aSopenharmony_ci *                unsigned, etc... This is useful for formats such as WAVE where
614cabdff1aSopenharmony_ci *                only 8-bit is unsigned and all other bit depths are signed.
615cabdff1aSopenharmony_ci * @return        a PCM codec id or AV_CODEC_ID_NONE
616cabdff1aSopenharmony_ci */
617cabdff1aSopenharmony_cienum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags);
618cabdff1aSopenharmony_ci
619cabdff1aSopenharmony_ci/**
620cabdff1aSopenharmony_ci * Copy side data from source to destination stream
621cabdff1aSopenharmony_ci *
622cabdff1aSopenharmony_ci * @param dst pointer to destination AVStream
623cabdff1aSopenharmony_ci * @param src pointer to source AVStream
624cabdff1aSopenharmony_ci * @return >=0 on success, AVERROR code on error
625cabdff1aSopenharmony_ci */
626cabdff1aSopenharmony_ciint ff_stream_side_data_copy(AVStream *dst, const AVStream *src);
627cabdff1aSopenharmony_ci
628cabdff1aSopenharmony_ci/**
629cabdff1aSopenharmony_ci * Wrap ffurl_move() and log if error happens.
630cabdff1aSopenharmony_ci *
631cabdff1aSopenharmony_ci * @param url_src source path
632cabdff1aSopenharmony_ci * @param url_dst destination path
633cabdff1aSopenharmony_ci * @return        0 or AVERROR on failure
634cabdff1aSopenharmony_ci */
635cabdff1aSopenharmony_ciint ff_rename(const char *url_src, const char *url_dst, void *logctx);
636cabdff1aSopenharmony_ci
637cabdff1aSopenharmony_ci/**
638cabdff1aSopenharmony_ci * Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end
639cabdff1aSopenharmony_ci * which is always set to 0.
640cabdff1aSopenharmony_ci *
641cabdff1aSopenharmony_ci * Previously allocated extradata in par will be freed.
642cabdff1aSopenharmony_ci *
643cabdff1aSopenharmony_ci * @param size size of extradata
644cabdff1aSopenharmony_ci * @return 0 if OK, AVERROR_xxx on error
645cabdff1aSopenharmony_ci */
646cabdff1aSopenharmony_ciint ff_alloc_extradata(AVCodecParameters *par, int size);
647cabdff1aSopenharmony_ci
648cabdff1aSopenharmony_ci/**
649cabdff1aSopenharmony_ci * Copies the whilelists from one context to the other
650cabdff1aSopenharmony_ci */
651cabdff1aSopenharmony_ciint ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src);
652cabdff1aSopenharmony_ci
653cabdff1aSopenharmony_ci/*
654cabdff1aSopenharmony_ci * A wrapper around AVFormatContext.io_close that should be used
655cabdff1aSopenharmony_ci * instead of calling the pointer directly.
656cabdff1aSopenharmony_ci *
657cabdff1aSopenharmony_ci * @param s AVFormatContext
658cabdff1aSopenharmony_ci * @param *pb the AVIOContext to be closed and freed. Can be NULL.
659cabdff1aSopenharmony_ci * @return >=0 on success, negative AVERROR in case of failure
660cabdff1aSopenharmony_ci */
661cabdff1aSopenharmony_ciint ff_format_io_close(AVFormatContext *s, AVIOContext **pb);
662cabdff1aSopenharmony_ci
663cabdff1aSopenharmony_ci/* Default io_close callback, not to be used directly, use ff_format_io_close
664cabdff1aSopenharmony_ci * instead. */
665cabdff1aSopenharmony_civoid ff_format_io_close_default(AVFormatContext *s, AVIOContext *pb);
666cabdff1aSopenharmony_ci
667cabdff1aSopenharmony_ci/**
668cabdff1aSopenharmony_ci * Utility function to check if the file uses http or https protocol
669cabdff1aSopenharmony_ci *
670cabdff1aSopenharmony_ci * @param s AVFormatContext
671cabdff1aSopenharmony_ci * @param filename URL or file name to open for writing
672cabdff1aSopenharmony_ci */
673cabdff1aSopenharmony_ciint ff_is_http_proto(const char *filename);
674cabdff1aSopenharmony_ci
675cabdff1aSopenharmony_cistruct AVBPrint;
676cabdff1aSopenharmony_ci/**
677cabdff1aSopenharmony_ci * Finalize buf into extradata and set its size appropriately.
678cabdff1aSopenharmony_ci */
679cabdff1aSopenharmony_ciint ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf);
680cabdff1aSopenharmony_ci
681cabdff1aSopenharmony_ciint ff_lock_avformat(void);
682cabdff1aSopenharmony_ciint ff_unlock_avformat(void);
683cabdff1aSopenharmony_ci
684cabdff1aSopenharmony_ci/**
685cabdff1aSopenharmony_ci * Set AVFormatContext url field to the provided pointer. The pointer must
686cabdff1aSopenharmony_ci * point to a valid string. The existing url field is freed if necessary. Also
687cabdff1aSopenharmony_ci * set the legacy filename field to the same string which was provided in url.
688cabdff1aSopenharmony_ci */
689cabdff1aSopenharmony_civoid ff_format_set_url(AVFormatContext *s, char *url);
690cabdff1aSopenharmony_ci
691cabdff1aSopenharmony_civoid avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[]);
692cabdff1aSopenharmony_ci
693cabdff1aSopenharmony_ci#endif /* AVFORMAT_INTERNAL_H */
694