38 #define PCR_TIME_BASE 27000000 42 #define DVB_PRIVATE_NETWORK_START 0xff01 104 #define MPEGTS_FLAG_REEMIT_PAT_PMT 0x01 105 #define MPEGTS_FLAG_AAC_LATM 0x02 106 #define MPEGTS_FLAG_PAT_PMT_AT_FRAMES 0x04 107 #define MPEGTS_FLAG_SYSTEM_B 0x08 108 #define MPEGTS_FLAG_DISCONT 0x10 121 #define DEFAULT_PES_HEADER_FREQ 16 122 #define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170) 126 #define SECTION_LENGTH 1020 133 const unsigned char *buf_ptr;
140 buf[len - 4] = (crc >> 24) & 0xff;
141 buf[len - 3] = (crc >> 16) & 0xff;
142 buf[len - 2] = (crc >> 8) & 0xff;
143 buf[len - 1] = crc & 0xff;
148 first = buf == buf_ptr;
156 s->
cc = s->
cc + 1 & 0xf;
169 memcpy(q, buf_ptr, len1);
174 memset(q, 0xff, left);
193 int version,
int sec_num,
int last_sec_num,
197 unsigned int tot_len;
201 tot_len = 3 + 5 + len + 4;
208 put16(&q, flags | (len + 5 + 4));
210 *q++ = 0xc1 | (version << 1);
222 #define DEFAULT_PROVIDER_NAME "FFmpeg" 223 #define DEFAULT_SERVICE_NAME "Service" 226 #define SDT_RETRANS_TIME 500 227 #define PAT_RETRANS_TIME 100 228 #define PCR_RETRANS_TIME 20 273 memcpy(*q_ptr, buf, len);
370 "Stream %d, codec %s, is muxed as a private data stream " 371 "and may not be recognized upon reading.\n", st->
index,
421 "Stream %d, codec %s, is muxed as a private data stream " 422 "and may not be recognized upon reading.\n", st->
index,
435 int val, stream_type,
i, err = 0;
440 program_info_length_ptr = q;
453 val = 0xf000 | (q - program_info_length_ptr - 2);
454 program_info_length_ptr[0] = val >> 8;
455 program_info_length_ptr[1] =
val;
547 static const uint8_t coupled_stream_counts[9] = {
548 1, 0, 1, 1, 2, 2, 2, 3, 3
550 static const uint8_t channel_map_a[8][8] = {
557 {0, 4, 1, 2, 3, 5, 6},
558 {0, 6, 1, 2, 3, 4, 5, 7},
560 static const uint8_t channel_map_b[8][8] = {
567 {0, 1, 2, 3, 4, 5, 6},
568 {0, 1, 2, 3, 4, 5, 6, 7},
602 char *next = lang->
value;
609 for (p = lang->
value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
614 next = strchr(p,
',');
615 if (strlen(p) != 3 && (!next || next != p + 3))
640 const char default_language[] =
"und";
641 const char *
language = lang && strlen(lang->
value) >= 3 ? lang->
value : default_language;
645 int extradata_copied = 0;
650 while (strlen(language) >= 3) {
651 if (
sizeof(data) - (q - data) < 8) {
659 if (*language !=
'\0')
665 extradata_copied += 5;
675 extradata_copied += 4;
684 *len_ptr = q - len_ptr - 1;
687 int extradata_copied = 0;
693 while (strlen(language) >= 3 && q - data <
sizeof(data) - 6) {
698 if (*language !=
'\0')
703 extradata_copied += 2;
715 *len_ptr = q - len_ptr - 1;
732 const char *
tag =
"ID3 ";
736 putbuf(&q, tag, strlen(tag));
738 putbuf(&q, tag, strlen(tag));
745 val = 0xf000 | (q - desc_length_ptr - 2);
746 desc_length_ptr[0] = val >> 8;
747 desc_length_ptr[1] =
val;
752 "The PMT section cannot fit stream %d and all following streams.\n" 753 "Try reducing the number of languages in the audio streams " 754 "or the total number of streams.\n", i);
766 int i, running_status, free_ca_mode,
val;
775 desc_list_len_ptr = q;
787 desc_len_ptr[0] = q - desc_len_ptr - 1;
790 val = (running_status << 13) | (free_ca_mode << 12) |
791 (q - desc_list_len_ptr - 2);
792 desc_list_len_ptr[0] = val >> 8;
793 desc_list_len_ptr[1] =
val;
808 str_len = strlen(str);
809 if (str[0] && (
unsigned)str[0] >= 0x20) {
811 int has_multibyte = 0;
815 has_multibyte |= (code > 127);
820 buf[0] = str_len + 1;
822 memcpy(&buf[2], str, str_len);
831 memcpy(&buf[1], str, str_len);
846 uint32_t tp_extra_header = pcr % 0x3fffffff;
847 tp_extra_header =
AV_RB32(&tp_extra_header);
849 sizeof(tp_extra_header));
868 char default_service_name[32];
869 const char *service_name;
870 const char *provider_name;
876 service_name = title ? title->
value : default_service_name;
896 service->
pmt.
cc = 15;
916 int64_t frame_period = 0;
1077 ts_st->
pid = st->
id;
1079 if (ts_st->
pid >= 0x1FFF) {
1081 "Invalid stream id %d, must be less than 8191\n", st->
id);
1095 for (j = 0; j <
i; j++) {
1097 if (ts_st_prev->
pid == ts_st->
pid) {
1150 "sdt every %"PRId64
" ms, pat/pmt every %"PRId64
" ms\n",
1184 int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;
1186 *buf++ = pcr_high >> 25;
1187 *buf++ = pcr_high >> 17;
1188 *buf++ = pcr_high >> 9;
1189 *buf++ = pcr_high >> 1;
1190 *buf++ = pcr_high << 7 | pcr_low >> 8 | 0x7e;
1221 *q++ = ts_st->
pid >> 8;
1223 *q++ = 0x20 | ts_st->
cc;
1244 val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
1246 val = (((pts >> 15) & 0x7fff) << 1) | 1;
1249 val = (((
pts) & 0x7fff) << 1) | 1;
1260 if ((pkt[3] & 0x20) == 0) {
1282 return pkt + 5 + pkt[4];
1292 const uint8_t *payload,
int payload_size,
1293 int64_t
pts, int64_t dts,
int key,
int stream_id)
1299 int val, is_start,
len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext,
flags;
1300 int afc_len, stuffing_len;
1317 while (payload_size > 0) {
1322 pcr = (dts - delay) * 300;
1333 int64_t next_pcr = INT64_MAX;
1374 val = ts_st->
pid >> 8;
1381 ts_st->
cc = ts_st->
cc + 1 & 0xf;
1382 *q++ = 0x10 | ts_st->
cc;
1405 int pes_extension = 0;
1406 int pes_header_stuffing_bytes = 0;
1411 is_dvb_subtitle = 0;
1412 is_dvb_teletext = 0;
1439 is_dvb_subtitle = 1;
1441 is_dvb_teletext = 1;
1477 if (is_dvb_teletext) {
1478 pes_header_stuffing_bytes = 0x24 - header_len;
1481 len = payload_size + header_len + 3;
1483 if (is_dvb_subtitle) {
1528 if (is_dvb_subtitle) {
1535 if (is_dvb_teletext) {
1536 memset(q, 0xff, pes_header_stuffing_bytes);
1537 q += pes_header_stuffing_bytes;
1542 header_len = q - buf;
1545 if (len > payload_size)
1548 if (stuffing_len > 0) {
1550 if (buf[3] & 0x20) {
1552 afc_len = buf[4] + 1;
1553 memmove(buf + 4 + afc_len + stuffing_len,
1555 header_len - (4 + afc_len));
1556 buf[4] += stuffing_len;
1557 memset(buf + 4 + afc_len, 0xff, stuffing_len);
1560 memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4);
1562 buf[4] = stuffing_len - 1;
1563 if (stuffing_len >= 2) {
1565 memset(buf + 6, 0xff, stuffing_len - 2);
1570 if (is_dvb_subtitle && payload_size == len) {
1578 payload_size -=
len;
1589 "no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it " 1590 "('-bsf:v h264_mp4toannexb' option with ffmpeg)\n");
1622 static const int durations[32] = {
1623 480, 960, 1920, 2880,
1624 480, 960, 1920, 2880,
1625 480, 960, 1920, 2880,
1633 int toc, frame_duration, nframes,
duration;
1640 frame_duration = durations[toc >> 3];
1654 nframes = pkt->
data[1] & 63;
1658 duration = nframes * frame_duration;
1659 if (duration > 5760) {
1661 "Opus packet duration > 120 ms, invalid");
1679 int opus_samples = 0;
1688 stream_id = side_data[0];
1710 uint32_t
state = -1;
1722 if ((state & 0x1f) == 7)
1724 }
while (p < buf_end && (state & 0x1f) != 9 &&
1725 (state & 0x1f) != 5 && (state & 0x1f) != 1);
1727 if ((state & 0x1f) != 5)
1729 if ((state & 0x1f) != 9) {
1734 memcpy(data + 6 + extradd, pkt->
data, pkt->
size);
1739 size = pkt->
size + 6 + extradd;
1742 if (pkt->
size < 2) {
1752 "and extradata missing\n");
1776 uint32_t
state = -1;
1788 if ((state & 0x7e) == 2*32)
1790 }
while (p < buf_end && (state & 0x7e) != 2*35 &&
1791 (state & 0x7e) >= 2*32);
1793 if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
1795 if ((state & 0x7e) != 2*35) {
1800 memcpy(data + 7 + extradd, pkt->
data, pkt->
size);
1806 size = pkt->
size + 7 + extradd;
1809 if (pkt->
size < 2) {
1819 int ctrl_header_size;
1820 int trim_start = 0, trim_end = 0;
1828 if (side_data && side_data_size >= 10) {
1832 ctrl_header_size = pkt->
size + 2 + pkt->
size / 255 + 1;
1834 ctrl_header_size += 2;
1836 ctrl_header_size += 2;
1861 AV_WB16(data + i, trim_start);
1866 trim_end =
FFMIN(trim_end, opus_samples - trim_start);
1871 memcpy(data + i, pkt->
data, pkt->
size);
1873 size = ctrl_header_size;
1883 uint8_t number_of_channels_flag;
1885 uint8_t full_service_flag = 1;
1888 dvb_ac3_desc =
av_mallocz(
sizeof(*dvb_ac3_desc));
1889 if (!dvb_ac3_desc) {
1897 number_of_channels_flag = 1;
1900 number_of_channels_flag = 0;
1904 number_of_channels_flag = 3;
1906 number_of_channels_flag = 2;
1913 number_of_channels_flag = 4;
1916 number_of_channels_flag = 7;
1920 if (service_type_flag == 1 || service_type_flag == 4 ||
1921 (service_type_flag == 7 && !number_of_channels_flag))
1922 full_service_flag = 0;
1926 ((service_type_flag & 0x7) << 3) |
1927 (number_of_channels_flag & 0x7);
1994 while (packets++ < 32)
2065 #define OFFSET(x) offsetof(MpegTSWrite, x) 2066 #define ENC AV_OPT_FLAG_ENCODING_PARAM 2068 {
"mpegts_transport_stream_id",
"Set transport_stream_id field.",
2070 {
"mpegts_original_network_id",
"Set original_network_id field.",
2072 {
"mpegts_service_id",
"Set service_id field.",
2074 {
"mpegts_service_type",
"Set service_type field.",
2076 {
"digital_tv",
"Digital Television.",
2078 {
"digital_radio",
"Digital Radio.",
2080 {
"teletext",
"Teletext.",
2082 {
"advanced_codec_digital_radio",
"Advanced Codec Digital Radio.",
2084 {
"mpeg2_digital_hdtv",
"MPEG2 Digital HDTV.",
2086 {
"advanced_codec_digital_sdtv",
"Advanced Codec Digital SDTV.",
2088 {
"advanced_codec_digital_hdtv",
"Advanced Codec Digital HDTV.",
2090 {
"hevc_digital_hdtv",
"HEVC Digital Television Service.",
2092 {
"mpegts_pmt_start_pid",
"Set the first pid of the PMT.",
2094 {
"mpegts_start_pid",
"Set the first pid.",
2096 {
"mpegts_m2ts_mode",
"Enable m2ts mode.",
OFFSET(m2ts_mode),
AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
2098 {
"pes_payload_size",
"Minimum PES packet payload in bytes",
2101 {
"resend_headers",
"Reemit PAT/PMT before writing the next packet",
2103 {
"latm",
"Use LATM packetization for AAC",
2105 {
"pat_pmt_at_frames",
"Reemit PAT and PMT at each video frame",
2107 {
"system_b",
"Conform to System B (DVB) instead of System A (ATSC)",
2109 {
"initial_discontinuity",
"Mark initial packets as discontinuous",
2111 {
"mpegts_copyts",
"don't offset dts/pts",
OFFSET(copyts),
AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
2112 {
"tables_version",
"set PAT, PMT and SDT version",
OFFSET(tables_version),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 31, ENC },
2113 {
"omit_video_pes_length",
"Omit the PES packet length for video packets",
2115 {
"pcr_period",
"PCR retransmission time in milliseconds",
2117 {
"pat_period",
"PAT/PMT retransmission time limit in seconds",
2119 {
"sdt_period",
"SDT retransmission time limit in seconds",
2134 .mime_type =
"video/MP2T",
2135 .extensions =
"ts,m2t,m2ts,mts",
2145 .priv_class = &mpegts_muxer_class,
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define GET_UTF8(val, GET_BYTE, ERROR)
Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
#define STREAM_TYPE_AUDIO_MPEG2
uint8_t provider_name[256]
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
ptrdiff_t const GLvoid * data
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file.
#define METADATA_DESCRIPTOR
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
static void retransmit_si_info(AVFormatContext *s, int force_pat, int force_sdt, int64_t pcr)
#define STREAM_TYPE_VIDEO_CAVS
static av_cold int init(AVCodecContext *avctx)
static void put_registration_descriptor(uint8_t **q_ptr, uint32_t tag)
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
static int mpegts_init(AVFormatContext *s)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int index
stream index in AVFormatContext
const char * av_default_item_name(void *ptr)
Return the context name.
#define ISO_639_LANGUAGE_DESCRIPTOR
#define STREAM_TYPE_AUDIO_EAC3
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
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 avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
int strict_std_compliance
Allow non-standard and experimental extension.
#define MPEGTS_FLAG_DISCONT
static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_st)
#define STREAM_ID_VIDEO_STREAM_0
unsigned int nb_stream_indexes
int avpriv_ac3_parse_header(AC3HeaderInfo **phdr, const uint8_t *buf, size_t size)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
Opaque data information usually continuous.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define M2TS_AUDIO_START_PID
#define DEFAULT_PES_PAYLOAD_SIZE
int id
Format-specific stream ID.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
#define STREAM_TYPE_VIDEO_HEVC
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
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.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
Public header for CRC hash function implementation.
static int encode_str8(uint8_t *buf, const char *str)
int initial_padding
Audio only.
int omit_video_pes_length
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
static void mpegts_insert_null_packet(AVFormatContext *s)
#define AV_LOG_VERBOSE
Detailed information.
int av_match_ext(const char *filename, const char *extensions)
Return a positive value if the given filename has one of the given extensions, 0 otherwise.
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
static void mpegts_write_sdt(AVFormatContext *s)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
#define M2TS_PGSSUB_START_PID
#define STREAM_ID_AUDIO_STREAM_0
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
#define STREAM_TYPE_VIDEO_VC1
static void extend_af(uint8_t *pkt, int size)
unsigned int * stream_index
#define MPEGTS_FLAG_AAC_LATM
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define STREAM_TYPE_AUDIO_AAC
MPEGTS stream ID as uint8_t, this is required to pass the stream ID information from the demuxer to t...
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
#define STREAM_TYPE_AUDIO_DTS
static void mpegts_write_pes(AVFormatContext *s, AVStream *st, const uint8_t *payload, int payload_size, int64_t pts, int64_t dts, int key, int stream_id)
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionary * metadata
Metadata that applies to the whole file.
static void put16(uint8_t **q_ptr, int val)
static int mpegts_write_section1(MpegTSSection *s, int tid, int id, int version, int sec_num, int last_sec_num, uint8_t *buf, int len)
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size)
Get side information from packet.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static uint8_t * get_ts_payload_start(uint8_t *pkt)
char * url
input or output URL.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define STREAM_TYPE_VIDEO_DIRAC
static void set_af_flag(uint8_t *pkt, int flag)
preferred ID for decoding MPEG audio layer 1, 2 or 3
enum AVMediaType codec_type
General type of the encoded data.
static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st)
simple assert() macros that are a bit more flexible than ISO C assert().
int mux_rate
set to 1 when VBR
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
AVRational avg_frame_rate
Average framerate.
New fields can be added to the end with minor version bumps.
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
This function is the same as av_get_audio_frame_duration(), except it works with AVCodecParameters in...
static void select_pcr_streams(AVFormatContext *s)
#define MPEGTS_FLAG_SYSTEM_B
int flags
A combination of AV_PKT_FLAG values.
int extradata_size
Size of the extradata content in bytes.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
#define STREAM_TYPE_AUDIO_AAC_LATM
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
Check presence of H264 startcode.
static const AVOption options[]
DVBAC3Descriptor * dvb_ac3_desc
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
#define AV_TIME_BASE
Internal time base represented as integer.
av_warn_unused_result int avformat_write_header(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and write the stream header to an output media file.
#define STREAM_TYPE_VIDEO_H264
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
static int write_trailer(AVFormatContext *s1)
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
#define DEFAULT_PROVIDER_NAME
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 check_hevc_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
static MpegTSService * mpegts_add_service(AVFormatContext *s, int sid, const AVDictionary *metadata, AVProgram *program)
AVOutputFormat ff_mpegts_muxer
uint8_t component_type_flag
#define MPEGTS_FLAG_REEMIT_PAT_PMT
static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
preferred ID for MPEG-1/2 video decoding
#define STREAM_TYPE_VIDEO_MPEG4
static void mpegts_deinit(AVFormatContext *s)
ff_const59 struct AVOutputFormat * oformat
The output container format.
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
void(* write_packet)(struct MpegTSSection *s, const uint8_t *packet)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define FF_PROFILE_KLVA_SYNC
#define STREAM_TYPE_METADATA
#define DVB_PRIVATE_NETWORK_START
#define STREAM_ID_PRIVATE_STREAM_1
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_RB24
AVIOContext * pb
I/O context.
#define MPEGTS_FLAG_PAT_PMT_AT_FRAMES
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
Undefined Behavior In the C language
Describe the class of an AVClass context structure.
static int opus_get_packet_samples(AVFormatContext *s, AVPacket *pkt)
#define FF_COMPLIANCE_NORMAL
ff_const59 AVOutputFormat * av_guess_format(const char *short_name, const char *filename, const char *mime_type)
Return the output format in the list of registered output formats which best matches the provided par...
Recommmends skipping the specified number of samples.
static int mpegts_write_end(AVFormatContext *s)
#define STREAM_TYPE_AUDIO_AC3
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
MpegTSService ** services
static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
static void mpegts_write_flush(AVFormatContext *s)
#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
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
int sample_rate
Audio only.
#define DEFAULT_SERVICE_NAME
common internal api header.
int profile
Codec-specific bitstream restrictions that the stream conforms to.
static int64_t get_pcr(const MpegTSWrite *ts)
int disposition
AV_DISPOSITION_* bit field.
static void putbuf(uint8_t **q_ptr, const uint8_t *buf, size_t len)
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
int64_t nb_frames
number of frames in this stream if known or 0
#define STREAM_ID_METADATA_STREAM
#define STREAM_ID_EXTENDED_STREAM_ID
#define STREAM_TYPE_VIDEO_MPEG2
void * priv_data
Format private data.
int first_timestamp_checked
first pts/dts check needed
static int check_bitstream(AVFormatContext *s, AVStream *st, AVPacket *pkt)
static void mpegts_write_pat(AVFormatContext *s)
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
static const AVClass mpegts_muxer_class
static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int opus_pending_trim_start
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
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 MKTAG(a, b, c, d)
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
#define STREAM_TYPE_AUDIO_MPEG1
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static double val(void *priv, double ch)
This structure stores compressed data.
static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
#define REGISTRATION_DESCRIPTOR
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define STREAM_TYPE_AUDIO_TRUEHD