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