54 #include "libavutil/ffversion.h"
70 return FFMPEG_CONFIGURATION;
75 #define LICENSE_PREFIX "libavformat license: "
79 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
97 timestamp < st->pts_wrap_reference)
110 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
112 MAKE_ACCESSORS(AVFormatContext, format,
int, metadata_header_padding)
141 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
175 #define SANE_CHUNK_SIZE (50000000)
181 if (remaining < size) {
184 s->
maxsize = newsize - !newsize;
186 remaining=
FFMAX(remaining, 0);
189 if (s->
maxsize>= 0 && remaining+1 < size) {
201 int64_t orig_pos = pkt->
pos;
202 int orig_size = pkt->
size;
206 int prev_size = pkt->
size;
224 if (ret != read_size) {
237 return pkt->
size > orig_size ? pkt->
size - orig_size :
ret;
267 static const struct {
291 "Probe with size=%d, packets=%d detected %s with score=%d\n",
294 for (i = 0; fmt_id_type[i].name; i++) {
295 if (!strcmp(fmt->
name, fmt_id_type[i].name)) {
343 "will be ignored with AVFMT_NOFILE format.\n");
368 (*plast_pktl)->next = pktl;
370 *packet_buffer = pktl;
385 if (copy.
size <= 0) {
387 "Attached picture on stream %d has invalid size, "
412 av_log(
NULL,
AV_LOG_ERROR,
"Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
424 if ((ret =
init_input(s, filename, &tmp)) < 0)
469 if (id3v2_extra_meta) {
536 "Failed to reallocate probe buffer for stream %d\n",
549 "nothing to probe for stream %d\n", st->
index);
576 int64_t ref = pkt->
dts;
577 int i, pts_wrap_behavior;
578 int64_t pts_wrap_reference;
596 if (!first_program) {
623 program = first_program;
667 if (!pktl || ret ==
AVERROR(EAGAIN))
682 "Dropped corrupted packet (stream = %d)\n",
752 switch (st->codec->codec_type) {
754 if (st->r_frame_rate.num && !pc &&
s->iformat) {
755 *pnum = st->r_frame_rate.den;
756 *pden = st->r_frame_rate.num;
757 }
else if (st->time_base.num * 1000LL > st->time_base.den) {
758 *pnum = st->time_base.num;
759 *pden = st->time_base.den;
760 }
else if (codec_framerate.den * 1000LL > codec_framerate.num) {
764 codec_framerate.num * (int64_t)st->codec->ticks_per_frame,
767 if (pc && pc->repeat_pict) {
770 (*pnum) * (1LL + pc->repeat_pict),
777 if (st->codec->ticks_per_frame > 1 && !pc)
783 if (frame_size <= 0 || st->codec->sample_rate <= 0)
786 *pden = st->codec->sample_rate;
814 #if CONFIG_H264_DECODER
845 int64_t best_score = INT64_MAX;
846 for (i = 0; i<delay; i++) {
849 if (score < best_score) {
856 for (i = 0; i<delay; i++) {
858 int64_t
diff =
FFABS(pts_buffer[i] - dts)
917 pts_buffer[0] = pktl->
pkt.
pts;
918 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
919 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
950 av_log(s,
AV_LOG_DEBUG,
"first_dts %s not matching first dts %s (pts %s, duration %d) in the queue\n",
984 int64_t next_dts, int64_t next_pts)
986 int num, den, presentation_delayed, delay, i;
1001 "DTS %"PRIi64
" < %"PRIi64
" out of order\n",
1027 presentation_delayed = 0;
1033 presentation_delayed = 1;
1048 if (delay == 1 && pkt->
dts == pkt->
pts &&
1051 if ( strcmp(s->
iformat->
name,
"mov,mp4,m4a,3gp,3g2,mj2")
1086 presentation_delayed = 1;
1089 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d delay:%d onein_oneout:%d\n",
1094 if ((delay == 0 || (delay == 1 && pc)) &&
1096 if (presentation_delayed) {
1114 ((uint64_t)st->
cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1115 next_dts != next_pts &&
1117 pkt->
pts = next_dts;
1154 av_dlog(
NULL,
"OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1168 *pkt_buf = pktl->
next;
1172 *pkt_buf_end =
NULL;
1186 int ret = 0, got_output = 0;
1197 while (size > 0 || (pkt == &
flush_pkt && got_output)) {
1199 int64_t next_pts = pkt->
pts;
1200 int64_t next_dts = pkt->
dts;
1204 &out_pkt.
data, &out_pkt.
size, data, size,
1213 got_output = !!out_pkt.
size;
1258 #if FF_API_DESTRUCT_PACKET
1294 *pkt_buffer = pktl->
next;
1296 *pkt_buffer_end =
NULL;
1308 int ret = 0, i, got_packet = 0;
1337 cur_pkt.
pts < cur_pkt.
dts) {
1339 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1347 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1357 "%s, packets or times may be invalid.\n",
1403 int discard_padding = 0;
1408 int64_t end_sample = sample +
duration;
1410 sample < st->last_discard_sample)
1417 AV_WL32(p + 4, discard_padding);
1437 memcpy(dst_data, src_sd->
data, src_sd->
size);
1456 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1457 "size=%d, duration=%d, flags=%d\n",
1493 int64_t last_dts = next_pkt->
dts;
1503 last_dts = pktl->
pkt.
dts;
1531 if (pktl && ret !=
AVERROR(EAGAIN)) {
1578 int best_stream = 0;
1579 int best_score = -1;
1600 if (score > best_score) {
1670 int *nb_index_entries,
1671 unsigned int *index_entries_allocated_size,
1672 int64_t pos, int64_t timestamp,
1678 if ((
unsigned) *nb_index_entries + 1 >= UINT_MAX /
sizeof(
AVIndexEntry))
1691 index_entries_allocated_size,
1692 (*nb_index_entries + 1) *
1697 *index_entries = entries;
1703 index = (*nb_index_entries)++;
1704 ie = &entries[
index];
1705 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1707 ie = &entries[
index];
1711 memmove(entries + index + 1, entries + index,
1713 (*nb_index_entries)++;
1714 }
else if (ie->
pos == pos && distance < ie->min_distance)
1734 timestamp, size, distance, flags);
1738 int64_t wanted_timestamp,
int flags)
1747 if (b && entries[b - 1].timestamp < wanted_timestamp)
1753 if (timestamp >= wanted_timestamp)
1755 if (timestamp <= wanted_timestamp)
1761 while (m >= 0 && m < nb_entries &&
1765 if (m == nb_entries)
1773 wanted_timestamp, flags);
1777 int64_t (*read_timestamp)(
struct AVFormatContext *,
int , int64_t *, int64_t ))
1779 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
1780 if (stream_index >= 0)
1786 int64_t target_ts,
int flags)
1790 int64_t ts_min, ts_max, ts;
1795 if (stream_index < 0)
1804 st = s->
streams[stream_index];
1812 index =
FFMAX(index, 0);
1818 av_dlog(s,
"using cached pos_min=0x%"PRIx64
" dts_min=%s\n",
1833 av_dlog(s,
"using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
1834 " dts_max=%s\n", pos_max, pos_limit,
av_ts2str(ts_max));
1838 pos =
ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1854 int64_t (*read_timestamp)(
struct AVFormatContext *,
int , int64_t *, int64_t ))
1856 int64_t step = 1024;
1857 int64_t limit, ts_max;
1859 int64_t pos_max = filesize - 1;
1862 pos_max =
FFMAX(0, (pos_max) - step);
1864 &pos_max, limit, read_timestamp);
1871 int64_t tmp_pos = pos_max + 1;
1873 &tmp_pos, INT64_MAX, read_timestamp);
1879 if (tmp_pos >= filesize)
1892 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1893 int64_t ts_min, int64_t ts_max,
1894 int flags, int64_t *ts_ret,
1896 int64_t *, int64_t))
1907 ts_min =
ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1912 if (ts_min >= target_ts) {
1918 if ((ret =
ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
1920 pos_limit = pos_max;
1923 if (ts_max <= target_ts) {
1931 while (pos_min < pos_limit) {
1933 "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%s dts_max=%s\n",
1937 if (no_change == 0) {
1938 int64_t approximate_keyframe_distance = pos_max - pos_limit;
1940 pos =
av_rescale(target_ts - ts_min, pos_max - pos_min,
1942 pos_min - approximate_keyframe_distance;
1943 }
else if (no_change == 1) {
1945 pos = (pos_min + pos_limit) >> 1;
1953 else if (pos > pos_limit)
1963 av_dlog(s,
"%"PRId64
" %"PRId64
" %"PRId64
" / %s %s %s"
1964 " target:%s limit:%"PRId64
" start:%"PRId64
" noc:%d\n",
1965 pos_min, pos, pos_max,
1967 pos_limit, start_pos, no_change);
1972 if (target_ts <= ts) {
1973 pos_limit = start_pos - 1;
1977 if (target_ts >= ts) {
1987 ts_min =
ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1989 ts_max =
ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1990 av_dlog(s,
"pos=0x%"PRIx64
" %s<=%s<=%s\n",
1998 int64_t pos,
int flags)
2000 int64_t pos_min, pos_max;
2007 else if (pos > pos_max)
2018 int64_t timestamp,
int flags)
2025 st = s->
streams[stream_index];
2029 if (index < 0 && st->nb_index_entries &&
2030 timestamp < st->index_entries[0].timestamp)
2033 if (index < 0 || index == st->nb_index_entries - 1) {
2051 }
while (read_status ==
AVERROR(EAGAIN));
2052 if (read_status < 0)
2059 av_log(s,
AV_LOG_ERROR,
"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
2082 int64_t timestamp,
int flags)
2094 if (stream_index < 0) {
2096 if (stream_index < 0)
2099 st = s->
streams[stream_index];
2126 int64_t timestamp,
int flags)
2131 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2137 flags & ~AVSEEK_FLAG_BACKWARD);
2149 int64_t ts, int64_t max_ts,
int flags)
2151 if (min_ts > ts || max_ts < ts)
2153 if (stream_index < -1 || stream_index >= (
int)s->
nb_streams)
2164 if (stream_index == -1 && s->
nb_streams == 1) {
2171 time_base.
num * (int64_t)AV_TIME_BASE,
2192 if (ret<0 && ts != min_ts && max_ts != ts) {
2193 ret =
av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2239 int64_t
start_time, start_time1, start_time_text, end_time, end_time1;
2240 int64_t
duration, duration1, filesize;
2245 start_time = INT64_MAX;
2246 start_time_text = INT64_MAX;
2247 end_time = INT64_MIN;
2248 duration = INT64_MIN;
2255 if (start_time1 < start_time_text)
2256 start_time_text = start_time1;
2258 start_time =
FFMIN(start_time, start_time1);
2261 end_time1 = start_time1 +
2264 end_time =
FFMAX(end_time, end_time1);
2276 duration =
FFMAX(duration, duration1);
2279 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text <
AV_TIME_BASE))
2280 start_time = start_time_text;
2281 else if (start_time > start_time_text)
2284 if (start_time != INT64_MAX) {
2286 if (end_time != INT64_MIN) {
2294 duration =
FFMAX(duration, end_time - start_time);
2302 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2304 if (bitrate >= 0 && bitrate <= INT_MAX)
2331 int i, show_warning = 0;
2376 "Estimating duration from bitrate, this may be inaccurate\n");
2379 #define DURATION_MAX_READ_SIZE 250000LL
2380 #define DURATION_MAX_RETRY 4
2387 int num, den, read_size, i,
ret;
2388 int found_duration = 0;
2402 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2415 is_end = found_duration;
2428 }
while (ret ==
AVERROR(EAGAIN));
2431 read_size += pkt->
size;
2488 av_log(ic,
AV_LOG_DEBUG,
"stream %d : no PTS found at end of file, duration not set\n", i);
2490 av_log(ic,
AV_LOG_DEBUG,
"stream %d : no TS found at start of file, duration not set\n", i);
2518 file_size =
FFMAX(0, file_size);
2544 av_dlog(ic,
"%d: start_time: %0.3f duration: %0.3f\n", i,
2549 "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2560 #define FAIL(errmsg) do { \
2562 *errmsg_ptr = errmsg; \
2568 FAIL(
"unknown codec");
2572 FAIL(
"unspecified frame size");
2575 FAIL(
"unspecified sample format");
2577 FAIL(
"unspecified sample rate");
2579 FAIL(
"unspecified number of channels");
2581 FAIL(
"no decodable DTS frames");
2585 FAIL(
"unspecified size");
2587 FAIL(
"unspecified pixel format");
2590 FAIL(
"no frame in rv30/40 and no sar");
2594 FAIL(
"unspecified size");
2608 int got_picture = 1,
ret = 0;
2631 av_dict_set(options ? options : &thread_opt,
"threads",
"1", 0);
2650 while ((pkt.
size > 0 || (!pkt.
data && got_picture)) &&
2659 &got_picture, &pkt);
2666 &got_picture, &pkt);
2681 if (!pkt.
data && !got_picture)
2703 if (tag == tags[i].tag)
2725 if (sflags & (1 << (bps - 1))) {
2767 for (i = 0; tags && tags[i]; i++) {
2770 if (codec_tags->
id ==
id) {
2771 *tag = codec_tags->
tag;
2783 for (i = 0; tags && tags[i]; i++) {
2808 if (j != i && next_start > ch->
start && next_start < end)
2811 ch->
end = (end == INT64_MAX) ? ch->
start : end;
2818 return (i + 1) * 1001;
2822 return ((
const int[]) { 40, 48, 50, 60, 80, 120, 240})[i] * 1001 * 12;
2826 return ((
const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
2892 && ts - (uint64_t)last < INT64_MAX) {
2906 double sdts = dts*framerate/(1001*12);
2907 for (j= 0; j<2; j++) {
2908 int64_t ticks =
llrint(sdts+j*0.5);
2909 double error= sdts - ticks + j*0.5;
2926 if (error0 > 0.04 && error1 > 0.04) {
2961 double best_error= 0.01;
2975 for (k= 0; k<2; k++) {
2980 if (error < best_error && best_error> 0.000000001) {
2989 if (num && (!ref_rate.
num || (
double)num/(12*1001) < 1.01 *
av_q2d(ref_rate)))
3020 int64_t max_stream_analyze_duration;
3023 if (!max_analyze_duration)
3027 flush_codecs = probesize > 0;
3031 max_stream_analyze_duration = max_analyze_duration;
3032 if (!max_analyze_duration) {
3033 max_stream_analyze_duration =
3040 av_log(ic,
AV_LOG_DEBUG,
"Before avformat_find_stream_info() pos: %"PRId64
" bytes read:%"PRId64
" seeks:%d\n",
3066 "%s, packets or times may be invalid.\n",
3074 av_dict_set(options ? &options[i] : &thread_opt,
"threads",
"1", 0);
3084 "Failed to open codec in av_find_stream_info\n");
3092 "Failed to open codec in av_find_stream_info\n");
3099 #if FF_API_R_FRAME_RATE
3109 int analyzed_all_streams;
3118 int fps_analyze_framecount = 20;
3127 fps_analyze_framecount *= 2;
3129 fps_analyze_framecount = 0;
3133 fps_analyze_framecount = 0;
3149 analyzed_all_streams = 0;
3151 analyzed_all_streams = 1;
3163 if (read_size >= probesize) {
3166 "Probe buffer size limit of %"PRId64
" bytes reached\n", probesize);
3173 "Stream #%d: not enough frames to estimate rate; "
3174 "consider increasing probesize\n", i);
3197 goto find_stream_info_err;
3200 goto find_stream_info_err;
3205 read_size += pkt->
size;
3212 "Non-increasing DTS in stream %d: packet %d with DTS "
3213 "%"PRId64
", packet %d with DTS %"PRId64
"\n",
3229 "DTS discontinuity in stream %d: packet %d with DTS "
3230 "%"PRId64
", packet %d with DTS %"PRId64
"\n",
3260 if (t >= (analyzed_all_streams ? max_analyze_duration : max_stream_analyze_duration)) {
3261 av_log(ic,
AV_LOG_VERBOSE,
"max_analyze_duration %"PRId64
" reached at %"PRId64
" microseconds\n",
3262 max_analyze_duration,
3273 #if FF_API_R_FRAME_RATE
3297 (options && i < orig_nb_streams) ? &options[i] :
NULL);
3319 (options && i < orig_nb_streams)
3320 ? &options[i] :
NULL);
3325 "decoding for stream %d failed\n", st->
index);
3353 double best_error = 0.01;
3370 if (error < best_error) {
3372 best_fps = std_fps.
num;
3377 best_fps, 12 * 1001, INT_MAX);
3435 "Could not find codec parameters for stream %d (%s): %s\n"
3436 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3445 find_stream_info_err:
3455 av_log(ic,
AV_LOG_DEBUG,
"After avformat_find_stream_info() pos: %"PRId64
" bytes read:%"PRId64
" seeks:%d frames:%d\n",
3478 int wanted_stream_nb,
int related_stream,
3479 AVCodec **decoder_ret,
int flags)
3483 unsigned *program =
NULL;
3486 if (related_stream >= 0 && wanted_stream_nb < 0) {
3494 int real_stream_index = program ? program[i] : i;
3499 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3501 if (wanted_stream_nb != real_stream_index &&
3520 if ((best_multiframe > multiframe) ||
3521 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3522 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >=
count))
3525 best_bitrate = bitrate;
3526 best_multiframe = multiframe;
3527 ret = real_stream_index;
3529 if (program && i == nb_streams - 1 && ret < 0) {
3537 *decoder_ret = (
AVCodec*)best_decoder;
3659 if (s->
nb_streams >= INT_MAX/
sizeof(*streams))
3709 #if FF_API_R_FRAME_RATE
3726 av_dlog(ac,
"new_program: id=0x%04x\n",
id);
3750 int64_t
start, int64_t
end,
const char *title)
3756 av_log(s,
AV_LOG_ERROR,
"Chapter end time %"PRId64
" before start %"PRId64
"\n", end, start);
3815 char *q, buf1[20],
c;
3816 int nd,
len, percentd_found;
3829 nd = nd * 10 + *p++ -
'0';
3842 snprintf(buf1,
sizeof(buf1),
"%0*d", nd, number);
3844 if ((q - buf + len) > buf_size - 1)
3846 memcpy(q, buf1, len);
3854 if ((q - buf) < buf_size - 1)
3858 if (!percentd_found)
3868 char *authorization,
int authorization_size,
3869 char *hostname,
int hostname_size,
3870 int *port_ptr,
char *path,
int path_size,
const char *url)
3872 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
3878 if (authorization_size > 0)
3879 authorization[0] = 0;
3880 if (hostname_size > 0)
3886 if ((p = strchr(url,
':'))) {
3900 ls = strchr(p,
'/');
3901 ls2 = strchr(p,
'?');
3905 ls =
FFMIN(ls, ls2);
3915 while ((at = strchr(p,
'@')) && at < ls) {
3917 FFMIN(authorization_size, at + 1 - at2));
3921 if (*p ==
'[' && (brk = strchr(p,
']')) && brk < ls) {
3924 FFMIN(hostname_size, brk - p));
3925 if (brk[1] ==
':' && port_ptr)
3926 *port_ptr = atoi(brk + 2);
3927 }
else if ((col = strchr(p,
':')) && col < ls) {
3929 FFMIN(col + 1 - p, hostname_size));
3931 *port_ptr = atoi(col + 1);
3934 FFMIN(ls + 1 - p, hostname_size));
3941 static const char hex_table_uc[16] = {
'0',
'1',
'2',
'3',
3944 'C',
'D',
'E',
'F' };
3945 static const char hex_table_lc[16] = {
'0',
'1',
'2',
'3',
3948 'c',
'd',
'e',
'f' };
3949 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3951 for (i = 0; i <
s; i++) {
3952 buff[i * 2] = hex_table[src[i] >> 4];
3953 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3970 if (c >=
'0' && c <=
'9')
3972 else if (c >=
'A' && c <=
'F')
3988 unsigned int pts_num,
unsigned int pts_den)
3992 if (new_tb.
num != pts_num)
3994 "st:%d removing common factor %d from timebase\n",
3998 "st:%d has too large timebase, reducing\n", s->
index);
4000 if (new_tb.
num <= 0 || new_tb.
den <= 0) {
4002 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4015 const char *ptr = str;
4020 char *dest =
NULL, *dest_end;
4021 int key_len, dest_len = 0;
4024 while (*ptr && (
av_isspace(*ptr) || *ptr ==
','))
4031 if (!(ptr = strchr(key,
'=')))
4034 key_len = ptr - key;
4036 callback_get_buf(context, key, key_len, &dest, &dest_len);
4037 dest_end = dest + dest_len - 1;
4041 while (*ptr && *ptr !=
'\"') {
4045 if (dest && dest < dest_end)
4049 if (dest && dest < dest_end)
4057 for (; *ptr && !(
av_isspace(*ptr) || *ptr ==
','); ptr++)
4058 if (dest && dest < dest_end)
4077 struct tm time1 = { 0 }, time2 = { 0 };
4092 return ofmt->
query_codec(codec_id, std_compliance);
4138 if (channel_layout) {
4146 if (width || height) {
4153 bytestream_put_le32(&data, flags);
4155 bytestream_put_le32(&data, channels);
4157 bytestream_put_le64(&data, channel_layout);
4159 bytestream_put_le32(&data, sample_rate);
4160 if (width || height) {
4161 bytestream_put_le32(&data, width);
4162 bytestream_put_le32(&data, height);
4174 av_reduce(&stream_sample_aspect_ratio.
num, &stream_sample_aspect_ratio.
den,
4175 stream_sample_aspect_ratio.
num, stream_sample_aspect_ratio.
den, INT_MAX);
4176 if (stream_sample_aspect_ratio.
num <= 0 || stream_sample_aspect_ratio.
den <= 0)
4177 stream_sample_aspect_ratio = undef;
4179 av_reduce(&frame_sample_aspect_ratio.
num, &frame_sample_aspect_ratio.
den,
4180 frame_sample_aspect_ratio.
num, frame_sample_aspect_ratio.
den, INT_MAX);
4181 if (frame_sample_aspect_ratio.
num <= 0 || frame_sample_aspect_ratio.
den <= 0)
4182 frame_sample_aspect_ratio = undef;
4184 if (stream_sample_aspect_ratio.
num)
4185 return stream_sample_aspect_ratio;
4187 return frame_sample_aspect_ratio;
4196 if (avg_fr.
num > 0 && avg_fr.
den > 0 && fr.
num > 0 && fr.
den > 0 &&
4203 if ( codec_fr.
num > 0 && codec_fr.
den > 0 &&
4214 if (*spec <= '9' && *spec >=
'0')
4215 return strtol(spec,
NULL, 0) == st->
index;
4216 else if (*spec ==
'v' || *spec ==
'a' || *spec ==
's' || *spec ==
'd' ||
4230 if (*spec++ ==
':') {
4234 return i == st->
index;
4238 }
else if (*spec ==
'p' && *(spec + 1) ==
':') {
4242 prog_id = strtol(spec, &endptr, 0);
4247 if (*endptr++ ==
':') {
4248 int stream_idx = strtol(endptr,
NULL, 0);
4249 return stream_idx >= 0 &&
4259 }
else if (*spec ==
'#' ||
4260 (*spec ==
'i' && *(spec + 1) ==
':')) {
4263 spec += 1 + (*spec ==
'i');
4264 stream_id = strtol(spec, &endptr, 0);
4266 return stream_id == st->
id;
4267 }
else if (*spec ==
'm' && *(spec + 1) ==
':') {
4273 val = strchr(spec,
':');
4281 if (!val || !strcmp(tag->
value, val + 1))
4299 static const uint8_t avci100_1080p_extradata[] = {
4301 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4302 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4303 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4304 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4305 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4306 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4307 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4308 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4309 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4311 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4314 static const uint8_t avci100_1080i_extradata[] = {
4316 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4317 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4318 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4319 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4320 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4321 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4322 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4323 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4324 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4325 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4326 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00,
4328 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4331 static const uint8_t avci50_1080p_extradata[] = {
4333 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4334 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4335 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4336 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4337 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4338 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
4339 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
4340 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
4341 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
4343 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4346 static const uint8_t avci50_1080i_extradata[] = {
4348 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4349 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4350 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4351 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4352 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4353 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4354 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4355 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4356 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4357 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4358 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4360 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4363 static const uint8_t avci100_720p_extradata[] = {
4365 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4366 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
4367 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
4368 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
4369 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
4370 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
4371 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
4372 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
4373 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
4374 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
4376 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
4379 static const uint8_t avci50_720p_extradata[] = {
4381 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
4382 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4383 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4384 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4385 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4386 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
4387 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
4388 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
4389 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
4391 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4400 data = avci100_1080p_extradata;
4401 size =
sizeof(avci100_1080p_extradata);
4403 data = avci100_1080i_extradata;
4404 size =
sizeof(avci100_1080i_extradata);
4408 data = avci50_1080p_extradata;
4409 size =
sizeof(avci50_1080p_extradata);
4411 data = avci50_1080i_extradata;
4412 size =
sizeof(avci50_1080i_extradata);
4415 data = avci100_720p_extradata;
4416 size =
sizeof(avci100_720p_extradata);
4418 data = avci50_720p_extradata;
4419 size =
sizeof(avci50_720p_extradata);
4461 if (sd->
type == type) {