Go to the documentation of this file.
47 #define MAX_RESYNC_SIZE 65536
49 #define MAX_PES_PAYLOAD 200 * 1024
51 #define MAX_MP4_DESCR_COUNT 16
53 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
55 if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
56 (modulus) = (dividend) % (divisor); \
57 (prev_dividend) = (dividend); \
60 #define PROBE_PACKET_MAX_BUF 8192
61 #define PROBE_PACKET_MARGIN 5
72 int is_start, int64_t
pos);
109 #define MAX_PIDS_PER_PROGRAM 64
173 #define MPEGTS_OPTIONS \
174 { "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 }
189 {.i64 = 0}, 0, 1, 0 },
191 {.i64 = 0}, 0, 1, 0 },
204 {
"compute_pcr",
"compute exact PCR for each transport stream packet",
207 {
"ts_packetsize",
"output option carrying the raw packet size",
232 #define PES_START_SIZE 6
233 #define PES_HEADER_SIZE 9
234 #define MAX_PES_HEADER_SIZE (9 + 255)
266 if (ts->
prg[
i].
id == programid) {
294 if (ts->
prg[
i].
id == programid) {
332 if (p->
pids[
i] == pid)
351 for (
i = 0;
i <
s->nb_programs;
i++) {
353 if (
program->id == programid) {
354 int old_pcr_pid =
program->pcr_pid,
355 old_version =
program->pmt_version;
359 if (old_version != -1 && old_version !=
version) {
361 "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
362 programid, old_version,
version, old_pcr_pid, pid);
380 int used = 0, discarded = 0;
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;
516 sec = &
filter->u.section_filter;
540 pes = &
filter->u.pes_filter;
580 memset(stat, 0, packet_size *
sizeof(*stat));
582 for (
i = 0;
i <
size - 3;
i++) {
583 if (buf[
i] == 0x47) {
584 int pid =
AV_RB16(buf+1) & 0x1FFF;
585 int asc = buf[
i + 3] & 0x30;
586 if (!
probe || pid == 0x1FFF || asc) {
587 int x =
i % packet_size;
590 if (stat[
x] > best_score) {
591 best_score = stat[
x];
597 return best_score -
FFMAX(stat_all - 10*best_score, 0)/10;
603 int score, fec_score, dvhs_score;
621 buf_size, score, dvhs_score, fec_score);
623 margin =
mid_pred(score, fec_score, dvhs_score);
630 else if (dvhs_score > margin)
632 else if (fec_score > margin)
699 const char *encodings[] = {
700 "ISO6937",
"ISO-8859-5",
"ISO-8859-6",
"ISO-8859-7",
701 "ISO-8859-8",
"ISO-8859-9",
"ISO-8859-10",
"ISO-8859-11",
702 "",
"ISO-8859-13",
"ISO-8859-14",
"ISO-8859-15",
"",
"",
"",
"",
703 "",
"UCS-2BE",
"KSC_5601",
"GB2312",
"UCS-2BE",
"UTF-8",
"",
"",
704 "",
"",
"",
"",
"",
"",
"",
""
708 size_t inlen =
len, outlen = inlen * 6 + 1;
709 if (
len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0
xf && p[2] != 0xc) {
711 snprintf(iso8859,
sizeof(iso8859),
"ISO-8859-%d", p[2]);
714 cd = iconv_open(
"UTF-8", iso8859);
715 }
else if (p[0] < 0x20) {
718 cd = iconv_open(
"UTF-8", encodings[*p]);
721 cd = iconv_open(
"UTF-8", encodings[0]);
723 if (cd == (iconv_t)-1)
730 if (iconv(cd, &
in, &inlen, &
out, &outlen) == -1) {
769 h->version = (
val >> 1) & 0x1f;
777 h->last_sec_num =
val;
796 #if !CONFIG_LOAS_DEMUXER
872 uint32_t stream_type,
889 uint32_t stream_type, uint32_t prog_reg_desc)
909 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
917 if ((prog_reg_desc ==
AV_RL32(
"HDMV") ||
918 prog_reg_desc ==
AV_RL32(
"HDPR")) &&
929 memcpy(sub_pes, pes,
sizeof(*sub_pes));
937 sub_st->
id = pes->
pid;
1034 const uint8_t *buf,
int buf_size)
1037 int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
1038 int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
1039 int dts_flag = -1, cts_flag = -1;
1044 memcpy(buf_padded, buf, buf_padded_size);
1053 au_start_flag = au_end_flag = 1;
1063 if (!idle_flag && (!padding_flag || padding_bits != 0)) {
1071 if (au_start_flag) {
1089 if (inst_bitrate_flag)
1118 const uint8_t *buf,
int buf_size,
int is_start,
1142 while (buf_size > 0) {
1143 switch (pes->
state) {
1155 if (pes->
header[0] == 0x00 && pes->
header[1] == 0x00 &&
1156 pes->
header[2] == 0x01) {
1194 if (
code != 0x1bc &&
code != 0x1bf &&
1201 "pid=%x stream_type=%x probing\n",
1249 unsigned int flags, pes_ext, skip;
1255 if ((
flags & 0xc0) == 0x80) {
1258 }
else if ((
flags & 0xc0) == 0xc0) {
1268 skip = (pes_ext >> 4) & 0xb;
1271 if ((pes_ext & 0x41) == 0x01 &&
1274 if ((
r[0] & 0x7f) > 0 && (
r[1] & 0x80) == 0)
1286 p += sl_header_bytes;
1287 buf_size -= sl_header_bytes;
1318 if (
f->last_pcr != -1 && !
f->discard) {
1323 int64_t pcr =
f->last_pcr / 300;
1330 pes->
pts = pes->
dts = pcr;
1332 pes->
dts > pcr + 3654 + 9000) {
1333 pes->
pts = pes->
dts = pcr + 3654 + 9000;
1335 pes->
dts > pcr + 10*90000) {
1336 pes->
pts = pes->
dts = pcr + 3654 + 9000;
1346 "Forcing DTS/PTS to be unset for a "
1347 "non-trustworthy PES packet for PID %d as "
1348 "PCR hasn't been received yet.\n",
1437 Mp4Descr *descr,
int max_descr_count)
1440 if (
size > (1 << 30))
1460 (*len) -= new_off - *off;
1496 if (!(id_flags & 0x0020)) {
1546 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \
1547 descr->sl.dst = avio_r8(&d->pb); \
1548 if (descr->sl.dst > maxv) { \
1549 descr->sl.dst = maxv; \
1550 return AVERROR_INVALIDDATA; \
1589 if (len < 0 || len1 >
len || len1 <= 0) {
1591 "Tag %x length violation new length %d bytes remaining %d\n",
1602 if (target_tag &&
tag != target_tag) {
1635 Mp4Descr *descr,
int *descr_count,
int max_descr_count)
1651 Mp4Descr *descr,
int *descr_count,
int max_descr_count)
1674 int mp4_descr_count = 0;
1679 p_end =
section + section_len - 4;
1688 mp4_read_od(
s, p, (
unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
1694 for (
i = 0;
i < mp4_descr_count;
i++) {
1708 pes->
sl = mp4_descr[
i].
sl;
1711 mp4_descr[
i].dec_config_descr_len, 0,
1725 for (
i = 0;
i < mp4_descr_count;
i++)
1726 av_free(mp4_descr[
i].dec_config_descr);
1751 if (
f &&
f->last_pcr != -1)
1759 1, 0, 1, 1, 2, 2, 2, 3, 3
1763 1, 1, 1, 2, 2, 3, 4, 4, 5,
1774 { 0,6,1,2,3,4,5,7 },
1779 Mp4Descr *mp4_descr,
int mp4_descr_count,
int pid,
1783 int desc_len, desc_tag, desc_es_id, ext_desc_tag,
channels, channel_config_code;
1787 desc_tag =
get8(pp, desc_list_end);
1790 desc_len =
get8(pp, desc_list_end);
1793 desc_end = *pp + desc_len;
1794 if (desc_end > desc_list_end)
1805 if (
get8(pp, desc_end) & 0x1) {
1810 desc_es_id =
get16(pp, desc_end);
1813 if (ts && ts->
pids[pid])
1815 for (
i = 0;
i < mp4_descr_count;
i++)
1816 if (mp4_descr[
i].dec_config_descr_len &&
1817 mp4_descr[
i].es_id == desc_es_id) {
1820 mp4_descr[
i].dec_config_descr_len, 0,
1833 if (
get16(pp, desc_end) < 0)
1835 if (mp4_descr_count > 0 &&
1856 int language_count = desc_len / 5,
ret;
1858 if (desc_len > 0 && desc_len % 5 != 0)
1861 if (language_count > 0) {
1876 for (
i = 0;
i < language_count;
i++) {
1882 memcpy(extradata, *pp, 2);
1901 int language_count = desc_len / 8,
ret;
1903 if (desc_len > 0 && desc_len % 8 != 0)
1906 if (language_count > 1) {
1910 if (language_count > 0) {
1927 for (
i = 0;
i < language_count;
i++) {
1945 extradata[4] =
get8(pp, desc_end);
1946 memcpy(extradata, *pp, 4);
1959 for (
i = 0;
i + 4 <= desc_len;
i += 4) {
1964 switch (
get8(pp, desc_end)) {
1997 if (
get16(pp, desc_end) == 0xFFFF)
1999 if (
get8(pp, desc_end) == 0xFF) {
2006 ext_desc_tag =
get8(pp, desc_end);
2007 if (ext_desc_tag < 0)
2010 ext_desc_tag == 0x80) {
2020 channel_config_code =
get8(pp, desc_end);
2021 if (channel_config_code < 0)
2023 if (channel_config_code <= 0x8) {
2036 if (ext_desc_tag == 0x06) {
2043 if ((
flags & 0x80) == 0)
2046 switch ((
flags >> 2) & 0x1F) {
2076 int component_type_flag =
get8(pp, desc_end) & (1 << 7);
2077 if (component_type_flag) {
2078 int component_type =
get8(pp, desc_end);
2079 int service_type_mask = 0x38;
2080 int service_type = ((component_type & service_type_mask) >> 3);
2081 if (service_type == 0x02 ) {
2090 int component_type_flag =
get8(pp, desc_end) & (1 << 7);
2091 if (component_type_flag) {
2092 int component_type =
get8(pp, desc_end);
2093 int service_type_mask = 0x38;
2094 int service_type = ((component_type & service_type_mask) >> 3);
2095 if (service_type == 0x02 ) {
2113 int data_component_id =
get16(pp, desc_end);
2114 if (data_component_id < 0)
2117 switch (data_component_id) {
2121 if (actual_component_tag >= 0x30 &&
2122 actual_component_tag <= 0x37) {
2129 if (actual_component_tag == 0x87) {
2152 if (desc_end - *pp < 4)
2161 buf =
get16(pp, desc_end);
2163 dovi->
dv_level = (buf >> 3) & 0x3f;
2167 if (desc_end - *pp >= 20) {
2168 buf =
get8(pp, desc_end);
2184 "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
2185 dovi->dv_version_major, dovi->dv_version_minor,
2186 dovi->dv_profile, dovi->dv_level,
2187 dovi->rpu_present_flag,
2188 dovi->el_present_flag,
2189 dovi->bl_present_flag,
2190 dovi->dv_bl_signal_compatibility_id);
2201 int stream_identifier,
int pmt_stream_idx)
2207 for (
i = 0;
i <
s->nb_streams;
i++) {
2211 if (stream_identifier != -1) {
2224 "re-using existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2238 int desc_len, desc_tag;
2240 desc_list_len =
get16(pp, p_end);
2241 if (desc_list_len < 0)
2243 desc_list_len &= 0xfff;
2244 desc_list_end = p + desc_list_len;
2245 if (desc_list_end > p_end)
2249 desc_tag =
get8(pp, desc_list_end);
2252 desc_len =
get8(pp, desc_list_end);
2255 desc_end = *pp + desc_len;
2256 if (desc_end > desc_list_end)
2259 if (desc_tag == 0x52) {
2260 return get8(pp, desc_end);
2270 return !(stream_type == 0x13 ||
2271 (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;
2287 int mp4_descr_count = 0;
2294 p_end =
section + section_len - 4;
2304 h->id,
h->sec_num,
h->last_sec_num,
h->version,
h->tid);
2314 pcr_pid =
get16(&p, p_end);
2323 program_info_length =
get16(&p, p_end);
2324 if (program_info_length < 0)
2326 program_info_length &= 0xfff;
2327 while (program_info_length >= 2) {
2334 if (
len > program_info_length - 2)
2337 program_info_length -=
len + 2;
2344 }
else if (
tag == 0x05 &&
len >= 4) {
2345 prog_reg_desc = bytestream_get_le32(&p);
2350 p += program_info_length;
2361 for (
i = 0; ;
i++) {
2364 stream_type =
get8(&p, p_end);
2365 if (stream_type < 0)
2367 pid =
get16(&p, p_end);
2410 if (pes && !pes->
st) {
2436 if (stream_type == 0x86 && prog_reg_desc ==
AV_RL32(
"CUEI")) {
2453 desc_list_len =
get16(&p, p_end);
2454 if (desc_list_len < 0)
2456 desc_list_len &= 0xfff;
2457 desc_list_end = p + desc_list_len;
2458 if (desc_list_end > p_end)
2462 desc_list_end, mp4_descr,
2463 mp4_descr_count, pid, ts) < 0)
2466 if (pes && prog_reg_desc ==
AV_RL32(
"HDMV") &&
2467 stream_type == 0x83 && pes->
sub_st) {
2476 if (!ts->
pids[pcr_pid])
2480 for (
i = 0;
i < mp4_descr_count;
i++)
2481 av_free(mp4_descr[
i].dec_config_descr);
2496 p_end =
section + section_len - 4;
2511 sid =
get16(&p, p_end);
2514 pmt_pid =
get16(&p, p_end);
2524 if (sid == 0x0000) {
2535 || fil->
pid != pmt_pid
2539 if (!ts->
pids[pmt_pid])
2582 p_end =
section + section_len - 4;
2596 if (
h->id == 0xFFFF) {
2618 const uint8_t *p, *p_end, *desc_list_end, *desc_end;
2619 int onid,
val, sid, desc_list_len, desc_tag, desc_len, service_type;
2620 char *
name, *provider_name;
2625 p_end =
section + section_len - 4;
2636 onid =
get16(&p, p_end);
2643 sid =
get16(&p, p_end);
2649 desc_list_len =
get16(&p, p_end);
2650 if (desc_list_len < 0)
2652 desc_list_len &= 0xfff;
2653 desc_list_end = p + desc_list_len;
2654 if (desc_list_end > p_end)
2657 desc_tag =
get8(&p, desc_list_end);
2660 desc_len =
get8(&p, desc_list_end);
2661 desc_end = p + desc_len;
2662 if (desc_len < 0 || desc_end > desc_list_end)
2666 desc_tag, desc_len);
2670 service_type =
get8(&p, p_end);
2671 if (service_type < 0)
2673 provider_name =
getstr8(&p, p_end);
2697 static int parse_pcr(int64_t *ppcr_high,
int *ppcr_low,
2704 int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
2705 has_adaptation, has_payload;
2708 pid =
AV_RB16(packet + 1) & 0x1fff;
2709 is_start = packet[1] & 0x40;
2710 tss = ts->
pids[pid];
2713 tss = ts->
pids[pid];
2723 afc = (packet[3] >> 4) & 3;
2726 has_adaptation = afc & 2;
2727 has_payload = afc & 1;
2728 is_discontinuity = has_adaptation &&
2733 cc = (packet[3] & 0xf);
2734 expected_cc = has_payload ? (tss->
last_cc + 1) & 0x0f : tss->
last_cc;
2735 cc_ok = pid == 0x1FFF ||
2743 "Continuity check failed for pid %d expected %d got %d\n",
2744 pid, expected_cc, cc);
2751 if (packet[1] & 0x80) {
2760 if (has_adaptation) {
2763 if (
parse_pcr(&pcr_h, &pcr_l, packet) == 0)
2764 tss->
last_pcr = pcr_h * 300 + pcr_l;
2770 if (p >= p_end || !has_payload)
2782 if (
len > p_end - p)
2845 int64_t back =
FFMIN(seekback,
pos);
2848 if (current_packet[0] == 0x80 && current_packet[12] == 0x47) {
2860 int new_packet_size,
ret;
2876 "max resync size reached, could not find sync byte\n");
2893 if ((*
data)[0] != 0x47) {
2948 if (nb_packets != 0 && packet_num >= nb_packets ||
2975 #define CHECK_COUNT 10
2976 #define CHECK_BLOCK 100
2986 score =
FFMAX3(score, dvhs_score, fec_score);
2988 maxscore =
FFMAX(maxscore, score);
2994 ff_dlog(0,
"TS score: %d %d\n", sumscore, maxscore);
2998 }
else if (check_count >=
CHECK_COUNT && sumscore > 6) {
3000 }
else if (check_count >=
CHECK_COUNT && maxscore > 6) {
3002 }
else if (sumscore > 6) {
3017 afc = (packet[3] >> 4) & 3;
3027 if (!(
flags & 0x10))
3032 *ppcr_high = ((int64_t) v << 1) | (p[4] >> 7);
3033 *ppcr_low = ((p[4] & 1) << 8) | p[5];
3050 int64_t
pos, probesize =
s->probesize;
3052 s->internal->prefer_codec_framerate = 1;
3086 int pcr_pid, pid, nb_packets, nb_pcrs,
ret, pcr_l;
3087 int64_t pcrs[2], pcr_h;
3088 int packet_count[2];
3110 if ((pcr_pid == -1 || pcr_pid == pid) &&
3114 packet_count[nb_pcrs] = nb_packets;
3115 pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
3118 if (pcrs[1] - pcrs[0] > 0) {
3124 packet_count[0] = packet_count[1];
3136 ts->
pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]);
3149 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
3155 int64_t pcr_h, next_pcr_h,
pos;
3156 int pcr_l, next_pcr_l;
3178 if (
parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
3181 ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
3188 ts->
cur_pcr = pcr_h * 300 + pcr_l;
3250 int64_t *ppos, int64_t pos_limit)
3253 int64_t
pos, timestamp;
3255 int pcr_l, pcr_pid =
3256 ((
PESContext *)
s->streams[stream_index]->priv_data)->pcr_pid;
3261 while(
pos < pos_limit) {
3266 if (buf[0] != 0x47) {
3272 if ((pcr_pid < 0 || (
AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
3273 parse_pcr(×tamp, &pcr_l, buf) == 0) {
3284 int64_t *ppos, int64_t pos_limit)
3293 while(
pos < pos_limit) {
3352 if (buf[0] != 0x47) {
3386 .
name =
"mpegtsraw",
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
static int mpegts_set_stream_info(AVStream *st, PESContext *pes, uint32_t stream_type, uint32_t prog_reg_desc)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
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 default minimum maximum flags name is the option name
#define MP4DecConfigDescrTag
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
static int get_bits_left(GetBitContext *gb)
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
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define AV_OPT_FLAG_READONLY
The option may not be set through the AVOptions API, only read.
enum AVMediaType codec_type
General type of the encoded data.
unsigned int nb_stream_indexes
@ AV_PKT_DATA_MPEGTS_STREAM_ID
MPEGTS stream ID as uint8_t, this is required to pass the stream ID information from the demuxer to t...
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
#define TS_DVHS_PACKET_SIZE
AVCodecContext * avctx
The codec context used by avformat_find_stream_info, the parser, etc.
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
Read size bytes from AVIOContext, returning a pointer.
#define STREAM_TYPE_PRIVATE_DATA
int flags
copied to the AVPacket flags
#define AVERROR_EOF
End of file.
int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
uint8_t * data
The data buffer.
static const uint8_t opus_default_extradata[30]
#define MKTAG(a, b, c, d)
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
Get the type of the given codec.
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
int program_num
Details of the MPEG-TS program which created this stream.
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
int pmt_found
have we found pmt for this program
static int get_bits_count(const GetBitContext *s)
static const StreamType METADATA_types[]
AVStream ** streams
A list of all streams in the file.
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
int auto_guess
if true, all pids are analyzed to find streams
@ AV_CODEC_ID_DVB_TELETEXT
AVStreamInternal * internal
An opaque field for libavformat internal usage.
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
MpegTSSectionFilter section_filter
#define AV_LOG_VERBOSE
Detailed information.
static AVBufferRef * buffer_pool_get(MpegTSContext *ts, int size)
#define fc(width, name, range_min, range_max)
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
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 buf_size
Size of buf except extra allocated bytes.
void SetServiceCallback(void *opaque, int ret)
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
int avcodec_is_open(AVCodecContext *s)
@ AV_CODEC_ID_HDMV_PGS_SUBTITLE
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
unsigned int nb_prg
structure to keep track of Program->pids mapping
int pcr_pid
if -1 then all packets containing PCR are considered
static void skip_bits(GetBitContext *s, int n)
#define PROBE_PACKET_MAX_BUF
static const AVClass mpegtsraw_class
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVBufferPool * av_buffer_pool_init(int size, AVBufferRef *(*alloc)(int size))
Allocate and initialize a buffer pool.
int64_t pts_wrap_reference
Internal data to check for wrapping of the time stamp.
MpegTSPESFilter pes_filter
static int mpegts_read_close(AVFormatContext *s)
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
static void update_av_program_info(AVFormatContext *s, unsigned int programid, unsigned int pid, int version)
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
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.
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new please make sure they are as small as space on each network bandwidth and so on benefit from smaller test cases Also keep in mind older checkouts use existing sample that means in practice generally do not remove or overwrite files as it likely would break older checkouts or releases Also all needed samples for a commit should be ideally before the push If you need an account for frequently uploading samples or you wish to help others by doing that send a mail to ffmpeg devel rsync vauL Duo x
static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
enum AVDiscard discard
selects which program to discard and which to feed to the caller
static av_cold int read_close(AVFormatContext *ctx)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static double val(void *priv, double ch)
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 type
AVProgram * av_new_program(AVFormatContext *s, int id)
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
@ AV_CODEC_ID_DVB_SUBTITLE
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
uint8_t header[MAX_PES_HEADER_SIZE]
unsigned int avio_rb32(AVIOContext *s)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
void avpriv_mpegts_parse_close(MpegTSContext *ts)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int pts_wrap_behavior
Options for behavior, when a wrap is detected.
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
static const uint8_t opus_coupled_stream_cnt[9]
static AVStream * find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid, int stream_identifier, int pmt_stream_idx)
int ctx_flags
Flags signalling stream properties.
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 int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
@ AV_CODEC_ID_MPEG4SYSTEMS
FAKE codec to indicate a MPEG-4 Systems stream (only used by libavformat)
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
static const AVClass mpegts_class
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
#define FF_PROFILE_ARIB_PROFILE_C
#define FF_PROFILE_UNKNOWN
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
enum AVStreamParseType need_parsing
static MpegTSFilter * mpegts_open_filter(MpegTSContext *ts, unsigned int pid, enum MpegTSFilterType type)
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf)
static const uint8_t opus_stream_cnt[9]
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
static int get8(const uint8_t **pp, const uint8_t *p_end)
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
@ AV_CODEC_ID_ARIB_CAPTION
int64_t cur_pcr
used to estimate the exact PCR
static void clear_programs(MpegTSContext *ts)
@ AVDISCARD_ALL
discard all
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
static int read_header(FFV1Context *f)
Describe the class of an AVClass context structure.
uint8_t dv_bl_signal_compatibility_id
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
int stop_parse
stop parsing loop
int64_t last_pos
to detect seek
static const StreamType DESC_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.
const char * av_default_item_name(void *ptr)
Return the context name.
static unsigned int get_bits1(GetBitContext *s)
static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
enum MpegTSFilterType type
static MpegTSFilter * mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
This structure contains the data a format has to probe a file.
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos)
unsigned int * stream_index
@ AV_CODEC_ID_MPEG2TS
FAKE codec to indicate a raw MPEG-2 TS stream (only used by libavformat)
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
static MpegTSFilter * mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, SectionCallback *section_cb, void *opaque, int check_crc)
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int max_descr_count)
#define MAX_PES_HEADER_SIZE
#define MAX_PACKET_READAHEAD
#define MAX_PIDS_PER_PROGRAM
unsigned int end_of_section_reached
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 parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
static int mpegts_push_data(MpegTSFilter *filter, const uint8_t *buf, int buf_size, int is_start, int64_t pos)
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
AVCodecID
Identify the syntax and semantics of the bitstream.
int extradata_size
Size of the extradata content in bytes.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
static const StreamType SCTE_types[]
static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
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))
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
static void reset_pes_packet_state(PESContext *pes)
int probe_packets
Number of packets to buffer for codec probing.
#define AV_NOPTS_VALUE
Undefined timestamp value.
int raw_packet_size
raw packet size, including FEC if present
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
int profile
Codec-specific bitstream restrictions that the stream conforms to.
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
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 ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
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 flags
A combination of AV_PKT_FLAG values.
static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
#define AV_LOG_INFO
Standard information.
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
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 is_pes_stream(int stream_type, uint32_t prog_reg_desc)
#define FF_PROFILE_ARIB_PROFILE_A
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
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
static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
#define MAX_MP4_DESCR_COUNT
static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
static int get16(const uint8_t **pp, const uint8_t *p_end)
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
static void set_pmt_found(MpegTSContext *ts, unsigned int programid)
#define xf(width, name, var, range_min, range_max, subs,...)
static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
int8_t crc_validity[NB_PID_MAX]
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
New fields can be added to the end with minor version bumps.
static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
static void clear_program(MpegTSContext *ts, unsigned int programid)
int pcr_incr
used to estimate the exact PCR
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Undefined Behavior In the C language
int disposition
AV_DISPOSITION_* bit field.
int id
Format-specific stream ID.
int ts_id
Transport stream id.
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
uint8_t * dec_config_descr
unsigned int avio_rb16(AVIOContext *s)
static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
#define AV_INPUT_BUFFER_PADDING_SIZE
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
AVInputFormat ff_mpegts_demuxer
#define FF_ARRAY_ELEMS(a)
#define TS_MAX_PACKET_SIZE
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.
int index
stream index in AVFormatContext
#define R8_CHECK_CLIP_MAX(dst, maxv)
static int probe(const AVProbeData *p)
static int mpegts_probe(const AVProbeData *p)
#define AV_OPT_FLAG_EXPORT
The option is intended for exporting values to the caller.
union MpegTSFilter::@265 u
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
static void mpegts_free(MpegTSContext *ts)
static const StreamType HDMV_types[]
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
static const StreamType ISO_types[]
static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
A reference to a data buffer.
AVPacket * pkt
packet containing Audio/Video data
static int mpegts_read_header(AVFormatContext *s)
#define avpriv_request_sample(...)
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet used
#define TS_FEC_PACKET_SIZE
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
AVInputFormat ff_mpegtsraw_demuxer
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
int64_t pos
byte position in stream, -1 if unknown
int predefined_SLConfigDescriptor_seen
static const AVOption raw_options[]
#define flags(name, subs,...)
static const uint8_t opus_channel_map[8][8]
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
unsigned int pids[MAX_PIDS_PER_PROGRAM]
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
@ AV_CODEC_ID_HDMV_TEXT_SUBTITLE
SectionCallback * section_cb
#define PROBE_PACKET_MARGIN
static uint64_t get_ts64(GetBitContext *gb, int bits)
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
static int get_packet_size(AVFormatContext *s)
static int analyze(const uint8_t *buf, int size, int packet_size, int probe)
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...
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, const uint8_t **data)
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
static const StreamType REGD_types[]
static const StreamType MISC_types[]
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
static const AVOption options[]
int64_t ts_packet_pos
position of first TS packet of this PES packet
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
int fix_teletext_pts
fix dvb teletext pts
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
@ AV_CODEC_ID_SCTE_35
Contain timestamp estimated through PCR of program stream.
enum AVMediaType codec_type