48 #define MAX_RESYNC_SIZE 65536 50 #define MAX_PES_PAYLOAD 200 * 1024 52 #define MAX_MP4_DESCR_COUNT 16 54 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \ 56 if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \ 57 (modulus) = (dividend) % (divisor); \ 58 (prev_dividend) = (dividend); \ 61 #define PROBE_PACKET_MAX_BUF 8192 62 #define PROBE_PACKET_MARGIN 5 73 int is_start, int64_t
pos);
91 unsigned int check_crc : 1;
92 unsigned int end_of_section_reached : 1;
115 #define MAX_STREAMS_PER_PROGRAM 128 116 #define MAX_PIDS_PER_PROGRAM (MAX_STREAMS_PER_PROGRAM + 2) 182 #define MPEGTS_OPTIONS \ 183 { "resync_size", "set size limit for looking up a new synchronization", offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM } 198 {.i64 = 0}, 0, 1, 0 },
200 {.i64 = 0}, 0, 1, 0 },
213 {
"compute_pcr",
"compute exact PCR for each transport stream packet",
216 {
"ts_packetsize",
"output option carrying the raw packet size",
241 #define PES_START_SIZE 6 242 #define PES_HEADER_SIZE 9 243 #define MAX_PES_HEADER_SIZE (9 + 255) 274 for (i = 0; i < ts->
nb_prg; i++) {
275 if (ts->
prg[i].
id == programid) {
337 for (i = 0; i < p->
nb_pids; i++)
338 if (p->
pids[i] == pid)
350 if (program->
id == programid) {
351 int old_pcr_pid = program->
pcr_pid,
356 if (old_version != -1 && old_version != version) {
358 "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
359 programid, old_version, version, old_pcr_pid, pid);
377 int used = 0, discarded = 0;
391 for (i = 0; i < ts->
nb_prg; i++) {
393 for (j = 0; j < p->
nb_pids; j++) {
394 if (p->
pids[j] != pid)
408 return !used && discarded;
416 const uint8_t *buf,
int buf_size,
int is_start)
442 len = (
AV_RB16(cur_section_buf + 1) & 0xfff) + 3;
582 memset(stat, 0, packet_size *
sizeof(*stat));
584 for (i = 0; i < size - 3; i++) {
585 if (buf[i] == 0x47) {
586 int pid =
AV_RB16(buf+1) & 0x1FFF;
587 int asc = buf[i + 3] & 0x30;
588 if (!probe || pid == 0x1FFF || asc) {
589 int x = i % packet_size;
592 if (stat[x] > best_score) {
593 best_score = stat[x];
599 return best_score -
FFMAX(stat_all - 10*best_score, 0)/10;
605 int score, fec_score, dvhs_score;
612 int max_iterations = 16;
624 buf_size, score, dvhs_score, fec_score);
626 margin =
mid_pred(score, fec_score, dvhs_score);
633 else if (dvhs_score > margin)
635 else if (fec_score > margin)
695 len =
get8(&p, p_end);
702 const char *encodings[] = {
703 "ISO6937",
"ISO-8859-5",
"ISO-8859-6",
"ISO-8859-7",
704 "ISO-8859-8",
"ISO-8859-9",
"ISO-8859-10",
"ISO-8859-11",
705 "",
"ISO-8859-13",
"ISO-8859-14",
"ISO-8859-15",
"",
"",
"",
"",
706 "",
"UCS-2BE",
"KSC_5601",
"GB2312",
"UCS-2BE",
"UTF-8",
"",
"",
707 "",
"",
"",
"",
"",
"",
"",
"" 711 size_t inlen =
len, outlen = inlen * 6 + 1;
712 if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0
xf && p[2] != 0xc) {
714 snprintf(iso8859,
sizeof(iso8859),
"ISO-8859-%d", p[2]);
717 cd = iconv_open(
"UTF-8", iso8859);
718 }
else if (p[0] < 0x20) {
721 cd = iconv_open(
"UTF-8", encodings[*p]);
724 cd = iconv_open(
"UTF-8", encodings[0]);
726 if (cd == (iconv_t)-1)
733 if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
760 val =
get8(pp, p_end);
765 val =
get16(pp, p_end);
769 val =
get8(pp, p_end);
772 h->
version = (val >> 1) & 0x1f;
773 val =
get8(pp, p_end);
777 val =
get8(pp, p_end);
799 #if !CONFIG_LOAS_DEMUXER 875 uint32_t stream_type,
892 uint32_t stream_type, uint32_t prog_reg_desc)
912 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
920 if ((prog_reg_desc ==
AV_RL32(
"HDMV") ||
921 prog_reg_desc ==
AV_RL32(
"HDPR")) &&
932 memcpy(sub_pes, pes,
sizeof(*sub_pes));
940 sub_st->
id = pes->
pid;
1037 const uint8_t *buf,
int buf_size)
1040 int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
1041 int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
1042 int dts_flag = -1, cts_flag = -1;
1047 memcpy(buf_padded, buf, buf_padded_size);
1056 au_start_flag = au_end_flag = 1;
1066 if (!idle_flag && (!padding_flag || padding_bits != 0)) {
1074 if (au_start_flag) {
1092 if (inst_bitrate_flag)
1110 if (!ts->
pools[index]) {
1113 if (!ts->
pools[index])
1121 const uint8_t *buf,
int buf_size,
int is_start,
1145 while (buf_size > 0) {
1146 switch (pes->
state) {
1158 if (pes->
header[0] == 0x00 && pes->
header[1] == 0x00 &&
1159 pes->
header[2] == 0x01) {
1161 code = pes->
header[3] | 0x100;
1197 if (code != 0x1bc && code != 0x1bf &&
1198 code != 0x1f0 && code != 0x1f1 &&
1199 code != 0x1ff && code != 0x1f2 &&
1204 "pid=%x stream_type=%x probing\n",
1252 unsigned int flags, pes_ext, skip;
1258 if ((flags & 0xc0) == 0x80) {
1261 }
else if ((flags & 0xc0) == 0xc0) {
1271 skip = (pes_ext >> 4) & 0xb;
1274 if ((pes_ext & 0x41) == 0x01 &&
1277 if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
1289 p += sl_header_bytes;
1290 buf_size -= sl_header_bytes;
1333 pes->
pts = pes->
dts = pcr;
1335 pes->
dts > pcr + 3654 + 9000) {
1336 pes->
pts = pes->
dts = pcr + 3654 + 9000;
1338 pes->
dts > pcr + 10*90000) {
1339 pes->
pts = pes->
dts = pcr + 3654 + 9000;
1350 "Forcing DTS/PTS to be unset for a " 1351 "non-trustworthy PES packet for PID %d as " 1352 "PCR hasn't been received yet.\n",
1441 Mp4Descr *descr,
int max_descr_count)
1444 if (size > (1 << 30))
1464 (*len) -= new_off - *off;
1500 if (!(id_flags & 0x0020)) {
1550 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \ 1551 descr->sl.dst = avio_r8(&d->pb); \ 1552 if (descr->sl.dst > maxv) { \ 1553 descr->sl.dst = maxv; \ 1554 return AVERROR_INVALIDDATA; \ 1593 if (len < 0 || len1 > len || len1 <= 0) {
1595 "Tag %x length violation new length %d bytes remaining %d\n",
1606 if (target_tag && tag != target_tag) {
1639 Mp4Descr *descr,
int *descr_count,
int max_descr_count)
1655 Mp4Descr *descr,
int *descr_count,
int max_descr_count)
1678 int mp4_descr_count = 0;
1683 p_end = section + section_len - 4;
1692 mp4_read_od(s, p, (
unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
1698 for (i = 0; i < mp4_descr_count; i++) {
1712 pes->
sl = mp4_descr[
i].
sl;
1715 mp4_descr[i].dec_config_descr_len, 0,
1729 for (i = 0; i < mp4_descr_count; i++)
1730 av_free(mp4_descr[i].dec_config_descr);
1763 1, 0, 1, 1, 2, 2, 2, 3, 3
1767 1, 1, 1, 2, 2, 3, 4, 4, 5,
1778 { 0,6,1,2,3,4,5,7 },
1783 Mp4Descr *mp4_descr,
int mp4_descr_count,
int pid,
1787 int desc_len, desc_tag, desc_es_id, ext_desc_tag,
channels, channel_config_code;
1791 desc_tag =
get8(pp, desc_list_end);
1794 desc_len =
get8(pp, desc_list_end);
1797 desc_end = *pp + desc_len;
1798 if (desc_end > desc_list_end)
1809 if (
get8(pp, desc_end) & 0x1) {
1814 desc_es_id =
get16(pp, desc_end);
1817 if (ts && ts->
pids[pid])
1819 for (i = 0; i < mp4_descr_count; i++)
1820 if (mp4_descr[i].dec_config_descr_len &&
1821 mp4_descr[i].es_id == desc_es_id) {
1824 mp4_descr[i].dec_config_descr_len, 0,
1837 if (
get16(pp, desc_end) < 0)
1839 if (mp4_descr_count > 0 &&
1860 int language_count = desc_len / 5,
ret;
1862 if (desc_len > 0 && desc_len % 5 != 0)
1865 if (language_count > 0) {
1867 av_assert0(language_count <=
sizeof(language) / 4);
1880 for (i = 0; i < language_count; i++) {
1881 language[i * 4 + 0] =
get8(pp, desc_end);
1882 language[i * 4 + 1] =
get8(pp, desc_end);
1883 language[i * 4 + 2] =
get8(pp, desc_end);
1884 language[i * 4 + 3] =
',';
1886 memcpy(extradata, *pp, 2);
1892 language[i * 4 - 1] = 0;
1905 int language_count = desc_len / 8,
ret;
1907 if (desc_len > 0 && desc_len % 8 != 0)
1910 if (language_count > 1) {
1914 if (language_count > 0) {
1918 av_assert0(language_count <=
sizeof(language) / 4);
1931 for (i = 0; i < language_count; i++) {
1932 language[i * 4 + 0] =
get8(pp, desc_end);
1933 language[i * 4 + 1] =
get8(pp, desc_end);
1934 language[i * 4 + 2] =
get8(pp, desc_end);
1935 language[i * 4 + 3] =
',';
1949 extradata[4] =
get8(pp, desc_end);
1950 memcpy(extradata, *pp, 4);
1956 language[i * 4 - 1] = 0;
1963 for (i = 0; i + 4 <= desc_len; i += 4) {
1964 language[i + 0] =
get8(pp, desc_end);
1965 language[i + 1] =
get8(pp, desc_end);
1966 language[i + 2] =
get8(pp, desc_end);
1967 language[i + 3] =
',';
1968 switch (
get8(pp, desc_end)) {
1981 if (i && language[0]) {
1982 language[i - 1] = 0;
2001 if (
get16(pp, desc_end) == 0xFFFF)
2003 if (
get8(pp, desc_end) == 0xFF) {
2010 ext_desc_tag =
get8(pp, desc_end);
2011 if (ext_desc_tag < 0)
2014 ext_desc_tag == 0x80) {
2024 channel_config_code =
get8(pp, desc_end);
2025 if (channel_config_code < 0)
2027 if (channel_config_code <= 0x8) {
2028 st->
codecpar->
extradata[9] = channels = channel_config_code ? channel_config_code : 2;
2040 if (ext_desc_tag == 0x06) {
2045 flags =
get8(pp, desc_end);
2047 if ((flags & 0x80) == 0)
2050 switch ((flags >> 2) & 0x1F) {
2066 language[0] =
get8(pp, desc_end);
2067 language[1] =
get8(pp, desc_end);
2068 language[2] =
get8(pp, desc_end);
2080 int component_type_flag =
get8(pp, desc_end) & (1 << 7);
2081 if (component_type_flag) {
2082 int component_type =
get8(pp, desc_end);
2083 int service_type_mask = 0x38;
2084 int service_type = ((component_type & service_type_mask) >> 3);
2085 if (service_type == 0x02 ) {
2094 int component_type_flag =
get8(pp, desc_end) & (1 << 7);
2095 if (component_type_flag) {
2096 int component_type =
get8(pp, desc_end);
2097 int service_type_mask = 0x38;
2098 int service_type = ((component_type & service_type_mask) >> 3);
2099 if (service_type == 0x02 ) {
2117 int data_component_id =
get16(pp, desc_end);
2118 if (data_component_id < 0)
2121 switch (data_component_id) {
2125 if (actual_component_tag >= 0x30 &&
2126 actual_component_tag <= 0x37) {
2133 if (actual_component_tag == 0x87) {
2156 if (desc_end - *pp < 4)
2165 buf =
get16(pp, desc_end);
2167 dovi->
dv_level = (buf >> 3) & 0x3f;
2171 if (desc_end - *pp >= 20) {
2172 buf =
get8(pp, desc_end);
2188 "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
2205 int stream_identifier,
int pmt_stream_idx,
struct Program *p)
2211 if (stream_identifier) {
2214 if (!found || pmt_stream_idx == i)
2223 "re-using existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2237 int desc_len, desc_tag;
2239 desc_list_len =
get16(pp, p_end);
2240 if (desc_list_len < 0)
2242 desc_list_len &= 0xfff;
2243 desc_list_end = p + desc_list_len;
2244 if (desc_list_end > p_end)
2248 desc_tag =
get8(pp, desc_list_end);
2251 desc_len =
get8(pp, desc_list_end);
2254 desc_end = *pp + desc_len;
2255 if (desc_end > desc_list_end)
2258 if (desc_tag == 0x52) {
2259 return get8(pp, desc_end);
2269 return !(stream_type == 0x13 ||
2270 (stream_type == 0x86 && prog_reg_desc ==
AV_RL32(
"CUEI")) );
2281 const uint8_t *p, *p_end, *desc_list_end;
2282 int program_info_length, pcr_pid, pid, stream_type;
2284 uint32_t prog_reg_desc = 0;
2285 int stream_identifier = -1;
2288 int mp4_descr_count = 0;
2295 p_end = section + section_len - 4;
2305 h->id, h->sec_num, h->last_sec_num, h->version, h->tid);
2325 pcr_pid =
get16(&p, p_end);
2334 program_info_length =
get16(&p, p_end);
2335 if (program_info_length < 0)
2337 program_info_length &= 0xfff;
2338 while (program_info_length >= 2) {
2340 tag =
get8(&p, p_end);
2341 len =
get8(&p, p_end);
2345 if (len > program_info_length - 2)
2348 program_info_length -= len + 2;
2356 prog_reg_desc = bytestream_get_le32(&p);
2361 p += program_info_length;
2375 stream_type =
get8(&p, p_end);
2376 if (stream_type < 0)
2378 pid =
get16(&p, p_end);
2417 if (pes && !pes->
st) {
2437 if (stream_type == 0x86 && prog_reg_desc ==
AV_RL32(
"CUEI")) {
2459 desc_list_len =
get16(&p, p_end);
2460 if (desc_list_len < 0)
2462 desc_list_len &= 0xfff;
2463 desc_list_end = p + desc_list_len;
2464 if (desc_list_end > p_end)
2468 desc_list_end, mp4_descr,
2469 mp4_descr_count, pid, ts) < 0)
2472 if (pes && prog_reg_desc ==
AV_RL32(
"HDMV") &&
2473 stream_type == 0x83 && pes->
sub_st) {
2482 if (!ts->
pids[pcr_pid])
2486 for (i = 0; i < mp4_descr_count; i++)
2487 av_free(mp4_descr[i].dec_config_descr);
2503 p_end = section + section_len - 4;
2517 sid =
get16(&p, p_end);
2520 pmt_pid =
get16(&p, p_end);
2530 if (sid == 0x0000) {
2542 || fil->
pid != pmt_pid
2546 if (!ts->
pids[pmt_pid])
2550 unsigned prg_idx = prg - ts->
prg;
2554 if (prg_idx > nb_prg)
2556 if (prg_idx >= nb_prg)
2566 for (i = 0; i < ts->
nb_prg; i++)
2598 p_end = section + section_len - 4;
2612 if (h->
id == 0xFFFF) {
2634 const uint8_t *p, *p_end, *desc_list_end, *desc_end;
2635 int onid,
val, sid, desc_list_len, desc_tag, desc_len, service_type;
2636 char *
name, *provider_name;
2641 p_end = section + section_len - 4;
2652 onid =
get16(&p, p_end);
2655 val =
get8(&p, p_end);
2659 sid =
get16(&p, p_end);
2662 val =
get8(&p, p_end);
2665 desc_list_len =
get16(&p, p_end);
2666 if (desc_list_len < 0)
2668 desc_list_len &= 0xfff;
2669 desc_list_end = p + desc_list_len;
2670 if (desc_list_end > p_end)
2673 desc_tag =
get8(&p, desc_list_end);
2676 desc_len =
get8(&p, desc_list_end);
2677 desc_end = p + desc_len;
2678 if (desc_len < 0 || desc_end > desc_list_end)
2682 desc_tag, desc_len);
2686 service_type =
get8(&p, p_end);
2687 if (service_type < 0)
2689 provider_name =
getstr8(&p, p_end);
2713 static int parse_pcr(int64_t *ppcr_high,
int *ppcr_low,
2720 int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
2721 has_adaptation, has_payload;
2724 pid =
AV_RB16(packet + 1) & 0x1fff;
2725 is_start = packet[1] & 0x40;
2726 tss = ts->
pids[pid];
2729 tss = ts->
pids[pid];
2739 afc = (packet[3] >> 4) & 3;
2742 has_adaptation = afc & 2;
2743 has_payload = afc & 1;
2744 is_discontinuity = has_adaptation &&
2749 cc = (packet[3] & 0xf);
2750 expected_cc = has_payload ? (tss->
last_cc + 1) & 0x0f : tss->
last_cc;
2751 cc_ok = pid == 0x1FFF ||
2759 "Continuity check failed for pid %d expected %d got %d\n",
2760 pid, expected_cc, cc);
2767 if (packet[1] & 0x80) {
2776 if (has_adaptation) {
2779 if (
parse_pcr(&pcr_h, &pcr_l, packet) == 0)
2780 tss->
last_pcr = pcr_h * 300 + pcr_l;
2786 if (p >= p_end || !has_payload)
2798 if (len > p_end - p)
2824 for (i = 0; i < ts->
nb_prg; i++) {
2861 int64_t back =
FFMIN(seekback, pos);
2864 if (current_packet[0] == 0x80 && current_packet[12] == 0x47) {
2876 int new_packet_size,
ret;
2892 "max resync size reached, could not find sync byte\n");
2909 if ((*data)[0] != 0x47) {
2964 if (nb_packets != 0 && packet_num >= nb_packets ||
2991 #define CHECK_COUNT 10 2992 #define CHECK_BLOCK 100 3002 score =
FFMAX3(score, dvhs_score, fec_score);
3004 maxscore =
FFMAX(maxscore, score);
3010 ff_dlog(0,
"TS score: %d %d\n", sumscore, maxscore);
3014 }
else if (check_count >=
CHECK_COUNT && sumscore > 6) {
3016 }
else if (check_count >=
CHECK_COUNT && maxscore > 6) {
3018 }
else if (sumscore > 6) {
3033 afc = (packet[3] >> 4) & 3;
3043 if (!(flags & 0x10))
3048 *ppcr_high = ((int64_t) v << 1) | (p[4] >> 7);
3049 *ppcr_low = ((p[4] & 1) << 8) | p[5];
3083 if (s->
iformat == &ff_mpegts_demuxer) {
3103 int pcr_pid, pid, nb_packets, nb_pcrs,
ret, pcr_l;
3104 int64_t pcrs[2], pcr_h;
3125 pid =
AV_RB16(data + 1) & 0x1fff;
3126 if ((pcr_pid == -1 || pcr_pid == pid) &&
3130 pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
3133 if (pcrs[1] - pcrs[0] > 0) {
3163 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188) 3169 int64_t pcr_h, next_pcr_h,
pos;
3170 int pcr_l, next_pcr_l;
3181 if (data != pkt->
data)
3192 if (
parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
3195 ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
3202 ts->
cur_pcr = pcr_h * 300 + pcr_l;
3237 if (!ret && pkt->
size < 0)
3264 int64_t *ppos, int64_t pos_limit)
3267 int64_t
pos, timestamp;
3269 int pcr_l, pcr_pid =
3275 while(pos < pos_limit) {
3280 if (buf[0] != 0x47) {
3286 if ((pcr_pid < 0 || (
AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
3287 parse_pcr(×tamp, &pcr_l, buf) == 0) {
3298 int64_t *ppos, int64_t pos_limit)
3307 while(pos < pos_limit) {
3318 int64_t dts = pkt.
dts;
3366 if (buf[0] != 0x47) {
3396 .priv_class = &mpegts_class,
3400 .
name =
"mpegtsraw",
3408 .priv_class = &mpegtsraw_class,
static void mpegts_free(MpegTSContext *ts)
uint8_t dv_bl_signal_compatibility_id
int64_t probesize
Maximum size of the data read from input for determining the input container format.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
ptrdiff_t const GLvoid * data
int64_t cur_pcr
used to estimate the exact PCR
#define AV_OPT_FLAG_EXPORT
The option is intended for exporting values to the caller.
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
#define PROBE_PACKET_MAX_BUF
#define MAX_PACKET_READAHEAD
#define METADATA_DESCRIPTOR
enum AVMediaType codec_type
static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
int64_t pos
byte position in stream, -1 if unknown
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
int8_t crc_validity[NB_PID_MAX]
int probe_packets
Number of packets to buffer for codec probing.
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
#define avpriv_request_sample(...)
#define PROBE_PACKET_MARGIN
static int analyze(const uint8_t *buf, int size, int packet_size, int probe)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int index
stream index in AVFormatContext
MpegTSPESFilter pes_filter
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * av_default_item_name(void *ptr)
Return the context name.
AVFormatInternal * internal
An opaque field for libavformat internal usage.
enum AVMediaType codec_type
int64_t bit_rate
Total stream bitrate in bit/s, 0 if not available.
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define ISO_639_LANGUAGE_DESCRIPTOR
Contain timestamp estimated through PCR of program stream.
AVInputFormat ff_mpegts_demuxer
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
#define FF_ARRAY_ELEMS(a)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
enum MpegTSFilterType type
#define MAX_STREAMS_PER_PROGRAM
int64_t pcr_incr
used to estimate the exact PCR
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
unsigned int avio_rb16(AVIOContext *s)
int ctx_flags
Flags signalling stream properties.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
int pcr_pid
if -1 then all packets containing PCR are considered
static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
unsigned int nb_prg
structure to keep track of Program->pids mapping
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, const uint8_t **data)
unsigned int nb_stream_indexes
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
unsigned int pids[MAX_PIDS_PER_PROGRAM]
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
static int mpegts_read_header(AVFormatContext *s)
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Opaque data information usually continuous.
static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
unsigned int avio_rb32(AVIOContext *s)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
int stop_parse
stop parsing loop
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
static int discard_pid(MpegTSContext *ts, unsigned int pid)
discard_pid() decides if the pid is to be discarded according to caller's programs selection ...
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static int mpegts_push_data(MpegTSFilter *filter, const uint8_t *buf, int buf_size, int is_start, int64_t pos)
int id
Format-specific stream ID.
enum AVStreamParseType need_parsing
static const AVOption raw_options[]
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
static const uint8_t opus_channel_map[8][8]
#define u(width, name, range_min, range_max)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
AVStream ** streams
A list of all streams in the file.
Public header for CRC hash function implementation.
int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
Read size bytes from AVIOContext, returning a pointer.
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
AVProgram * av_new_program(AVFormatContext *s, int id)
static int get_bits_count(const GetBitContext *s)
#define AVERROR_EOF
End of file.
bitstream reader API header.
static av_cold int read_close(AVFormatContext *ctx)
#define AV_LOG_VERBOSE
Detailed information.
union MpegTSFilter::@270 u
#define FF_PROFILE_ARIB_PROFILE_C
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static const uint8_t header[24]
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos)
enum AVDiscard discard
selects which program to discard and which to feed to the caller
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
unsigned int * stream_index
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
AVInputFormat ff_mpegtsraw_demuxer
static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int max_descr_count)
MPEGTS stream ID as uint8_t, this is required to pass the stream ID information from the demuxer to t...
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
static int get_bits_left(GetBitContext *gb)
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
#define fc(width, name, range_min, range_max)
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2, section 2.2 dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2, section 3.3 Tags are stored in struct AVDOVIDecoderConfigurationRecord.
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
static const uint8_t opus_default_extradata[30]
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const StreamType SCTE_types[]
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
int predefined_SLConfigDescriptor_seen
static const StreamType HDMV_types[]
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
static int mpegts_read_close(AVFormatContext *s)
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
ff_const59 struct AVInputFormat * iformat
The input container format.
int avcodec_is_open(AVCodecContext *s)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int pts_wrap_behavior
Options for behavior, when a wrap is detected.
preferred ID for decoding MPEG audio layer 1, 2 or 3
enum AVMediaType codec_type
General type of the encoded data.
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
simple assert() macros that are a bit more flexible than ISO C assert().
#define TS_FEC_PACKET_SIZE
New fields can be added to the end with minor version bumps.
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
int flags
copied to the AVPacket flags
int flags
A combination of AV_PKT_FLAG values.
int extradata_size
Size of the extradata content in bytes.
int avio_r8(AVIOContext *s)
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array through a pointer to a pointer.
int buf_size
Size of buf except extra allocated bytes.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
common internal API header
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
int64_t ts_packet_pos
position of first TS packet of this PES packet
SectionCallback * section_cb
static const StreamType REGD_types[]
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
static const StreamType MISC_types[]
int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as stream side data.
static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
#define TS_DVHS_PACKET_SIZE
static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
#define FF_PROFILE_UNKNOWN
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C program
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
static int mpegts_probe(const AVProbeData *p)
static void clear_program(struct Program *p)
static int mpegts_set_stream_info(AVStream *st, PESContext *pes, uint32_t stream_type, uint32_t prog_reg_desc)
static const uint8_t opus_stream_cnt[9]
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
static const AVClass mpegtsraw_class
MpegTSSectionFilter section_filter
static const uint8_t opus_coupled_stream_cnt[9]
static uint64_t get_ts64(GetBitContext *gb, int bits)
static int get_packet_size(AVFormatContext *s)
preferred ID for MPEG-1/2 video decoding
int auto_guess
if true, all pids are analyzed to find streams
int raw_packet_size
raw packet size, including FEC if present
static const StreamType ISO_types[]
static int read_header(FFV1Context *f)
int ts_id
Transport stream id.
#define VIDEO_STREAM_DESCRIPTOR
static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
FAKE codec to indicate a MPEG-4 Systems stream (only used by libavformat)
static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
#define AV_LOG_INFO
Standard information.
#define TS_MAX_PACKET_SIZE
uint8_t * dec_config_descr
AVStreamInternal * internal
An opaque field for libavformat internal usage.
#define MP4DecConfigDescrTag
static MpegTSFilter * mpegts_open_filter(MpegTSContext *ts, unsigned int pid, enum MpegTSFilterType type)
AVIOContext * pb
I/O context.
static const StreamType METADATA_types[]
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
int64_t pts_wrap_reference
Internal data to check for wrapping of the time stamp.
uint8_t * data
The data buffer.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
#define STREAM_TYPE_PRIVATE_DATA
#define MAX_PES_HEADER_SIZE
static int get8(const uint8_t **pp, const uint8_t *p_end)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define MAX_PIDS_PER_PROGRAM
static unsigned int get_bits1(GetBitContext *s)
Undefined Behavior In the C language
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
static AVStream * find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid, int stream_identifier, int pmt_stream_idx, struct Program *p)
Describe the class of an AVClass context structure.
static void skip_bits(GetBitContext *s, int n)
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar) ...
int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
refcounted data buffer API
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
static const StreamType DESC_types[]
This structure contains the data a format has to probe a file.
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
#define flags(name, subs,...)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
unsigned int end_of_section_reached
static void write_section_data(MpegTSContext *ts, MpegTSFilter *tss1, const uint8_t *buf, int buf_size, int is_start)
Assemble PES packets out of TS packets, and then call the "section_cb" function when they are complet...
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, const uint8_t **pp, const uint8_t *desc_list_end, Mp4Descr *mp4_descr, int mp4_descr_count, int pid, MpegTSContext *ts)
Parse an MPEG-2 descriptor.
static void clear_programs(MpegTSContext *ts)
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
static int probe(const AVProbeData *p)
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
A reference to a data buffer.
static const AVOption options[]
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
static AVBufferRef * buffer_pool_get(MpegTSContext *ts, int size)
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
static const AVClass mpegts_class
static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
common internal and external API header
AVBufferPool * av_buffer_pool_init(int size, AVBufferRef *(*alloc)(int size))
Allocate and initialize a buffer pool.
struct Stream streams[MAX_STREAMS_PER_PROGRAM]
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
int profile
Codec-specific bitstream restrictions that the stream conforms to.
static void add_pid_to_program(struct Program *p, unsigned int pid)
int disposition
AV_DISPOSITION_* bit field.
uint8_t header[MAX_PES_HEADER_SIZE]
#define FF_PROFILE_ARIB_PROFILE_A
static void reset_pes_packet_state(PESContext *pes)
static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
int pmt_found
have we found pmt for this program
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
static MpegTSFilter * mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, SectionCallback *section_cb, void *opaque, int check_crc)
FAKE codec to indicate a raw MPEG-2 TS stream (only used by libavformat)
static int get16(const uint8_t **pp, const uint8_t *p_end)
#define xf(width, name, var, range_min, range_max, subs,...)
AVPacket * pkt
packet containing Audio/Video data
void * priv_data
Format private data.
int64_t last_pos
to detect seek
#define AV_OPT_FLAG_READONLY
The option may not be set through the AVOptions API, only read.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
AVCodecContext * avctx
The codec context used by avformat_find_stream_info, the parser, etc.
void SetServiceCallback(void *opaque, int ret)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
Get the type of the given codec.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
static MpegTSFilter * mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
#define FFSWAP(type, a, b)
static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
#define MAX_MP4_DESCR_COUNT
#define MKTAG(a, b, c, d)
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
void avpriv_mpegts_parse_close(MpegTSContext *ts)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static double val(void *priv, double ch)
This structure stores compressed data.
#define R8_CHECK_CLIP_MAX(dst, maxv)
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
#define REGISTRATION_DESCRIPTOR
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static void update_av_program_info(AVFormatContext *s, unsigned int programid, unsigned int pid, int version)
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
#define AV_NOPTS_VALUE
Undefined timestamp value.
int fix_teletext_pts
fix dvb teletext pts
static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)