@ -121,7 +121,6 @@ typedef struct mkv_attachments {
typedef struct MatroskaMuxContext {
const AVClass * class ;
int mode ;
AVIOContext * dyn_bc ;
AVIOContext * tags_bc ;
ebml_master tags ;
AVIOContext * info_bc ;
@ -130,6 +129,7 @@ typedef struct MatroskaMuxContext {
ebml_master tracks_master ;
ebml_master segment ;
int64_t segment_offset ;
AVIOContext * cluster_bc ;
ebml_master cluster ;
int64_t cluster_pos ; ///< file offset of the current cluster
int64_t cluster_pts ;
@ -159,8 +159,8 @@ typedef struct MatroskaMuxContext {
int64_t last_track_timestamp [ MAX_TRACKS ] ;
int64_t * stream_durations ;
int64_t * stream_duration_offsets ;
int64_t * stream_durations ;
int64_t * stream_duration_offsets ;
int allow_raw_vfw ;
} MatroskaMuxContext ;
@ -320,7 +320,7 @@ static ebml_master start_ebml_master(AVIOContext *pb, uint32_t elementid,
put_ebml_id ( pb , elementid ) ;
put_ebml_size_unknown ( pb , bytes ) ;
return ( ebml_master ) { avio_tell ( pb ) , bytes } ;
return ( ebml_master ) { avio_tell ( pb ) , bytes } ;
}
static void end_ebml_master ( AVIOContext * pb , ebml_master master )
@ -369,12 +369,11 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, Matrosk
}
/**
* Complete ebml master wh ithout destroying the buffer , allowing for later updates
* Complete ebml master without destroying the buffer , allowing for later updates
*/
static void end_ebml_master_crc32_preliminary ( AVIOContext * pb , AVIOContext * * dyn_cp , MatroskaMuxContext * mkv ,
ebml_master master )
{
uint8_t * buf ;
int size = avio_get_dyn_buf ( * dyn_cp , & buf ) ;
@ -393,8 +392,8 @@ static void put_xiph_size(AVIOContext *pb, int size)
*/
static void mkv_free ( MatroskaMuxContext * mkv ) {
uint8_t * buf ;
if ( mkv - > dyn _bc) {
avio_close_dyn_buf ( mkv - > dyn _bc, & buf ) ;
if ( mkv - > cluster _bc) {
avio_close_dyn_buf ( mkv - > cluster _bc, & buf ) ;
av_free ( buf ) ;
}
if ( mkv - > info_bc ) {
@ -1569,9 +1568,9 @@ static int mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t)
return 0 ;
}
static int mkv_write_tag_targets ( AVFormatContext * s ,
uint32_t elementid , unsigned int uid ,
ebml_master * tags , ebml_master * tag )
static int mkv_write_tag_targets ( AVFormatContext * s , uint32_t elementid ,
unsigned int uid , ebml_master * tags ,
ebml_master * tag )
{
AVIOContext * pb ;
MatroskaMuxContext * mkv = s - > priv_data ;
@ -1888,9 +1887,9 @@ static int mkv_write_header(AVFormatContext *s)
put_ebml_uint ( pb , EBML_ID_EBMLREADVERSION , 1 ) ;
put_ebml_uint ( pb , EBML_ID_EBMLMAXIDLENGTH , 4 ) ;
put_ebml_uint ( pb , EBML_ID_EBMLMAXSIZELENGTH , 8 ) ;
put_ebml_string ( pb , EBML_ID_DOCTYPE , s - > oformat - > name ) ;
put_ebml_string ( pb , EBML_ID_DOCTYPE , s - > oformat - > name ) ;
put_ebml_uint ( pb , EBML_ID_DOCTYPEVERSION , version ) ;
put_ebml_uint ( pb , EBML_ID_DOCTYPEREADVERSION , 2 ) ;
put_ebml_uint ( pb , EBML_ID_DOCTYPEREADVERSION , 2 ) ;
end_ebml_master ( pb , ebml_header ) ;
mkv - > segment = start_ebml_master ( pb , MATROSKA_ID_SEGMENT , 0 ) ;
@ -2256,7 +2255,7 @@ static void mkv_start_new_cluster(AVFormatContext *s, AVPacket *pkt)
{
MatroskaMuxContext * mkv = s - > priv_data ;
end_ebml_master_crc32 ( s - > pb , & mkv - > dyn _bc, mkv , mkv - > cluster ) ;
end_ebml_master_crc32 ( s - > pb , & mkv - > cluster _bc, mkv , mkv - > cluster ) ;
mkv - > cluster_pos = - 1 ;
av_log ( s , AV_LOG_DEBUG ,
" Starting new cluster at offset % " PRIu64 " bytes, "
@ -2401,13 +2400,13 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_
if ( mkv - > cluster_pos = = - 1 ) {
mkv - > cluster_pos = avio_tell ( s - > pb ) ;
ret = start_ebml_master_crc32 ( s - > pb , & mkv - > dyn _bc, mkv , & mkv - > cluster , MATROSKA_ID_CLUSTER , 0 ) ;
ret = start_ebml_master_crc32 ( s - > pb , & mkv - > cluster _bc, mkv , & mkv - > cluster , MATROSKA_ID_CLUSTER , 0 ) ;
if ( ret < 0 )
return ret ;
put_ebml_uint ( mkv - > dyn _bc, MATROSKA_ID_CLUSTERTIMECODE , FFMAX ( 0 , ts ) ) ;
put_ebml_uint ( mkv - > cluster _bc, MATROSKA_ID_CLUSTERTIMECODE , FFMAX ( 0 , ts ) ) ;
mkv - > cluster_pts = FFMAX ( 0 , ts ) ;
}
pb = mkv - > dyn _bc;
pb = mkv - > cluster _bc;
relative_packet_pos = avio_tell ( pb ) ;
@ -2477,7 +2476,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
// start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
// after 4k and on a keyframe
cluster_size = avio_tell ( mkv - > dyn _bc) ;
cluster_size = avio_tell ( mkv - > cluster _bc) ;
if ( mkv - > is_dash & & codec_type = = AVMEDIA_TYPE_VIDEO ) {
// WebM DASH specification states that the first block of every cluster
@ -2537,7 +2536,7 @@ static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt)
if ( ! pkt ) {
if ( mkv - > cluster_pos ! = - 1 ) {
end_ebml_master_crc32 ( s - > pb , & mkv - > dyn _bc, mkv , mkv - > cluster ) ;
end_ebml_master_crc32 ( s - > pb , & mkv - > cluster _bc, mkv , mkv - > cluster ) ;
mkv - > cluster_pos = - 1 ;
av_log ( s , AV_LOG_DEBUG ,
" Flushing cluster at offset % " PRIu64 " bytes \n " ,
@ -2567,8 +2566,8 @@ static int mkv_write_trailer(AVFormatContext *s)
}
}
if ( mkv - > dyn _bc) {
end_ebml_master_crc32 ( pb , & mkv - > dyn _bc, mkv , mkv - > cluster ) ;
if ( mkv - > cluster _bc) {
end_ebml_master_crc32 ( pb , & mkv - > cluster _bc, mkv , mkv - > cluster ) ;
}
ret = mkv_write_chapters ( s ) ;