X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmatroskaenc.c;h=b8c4667a4efd09f6252cb9ad042070039f18e7ce;hb=e4de71677f3adeac0f74b89ac8df5d417364df2c;hp=da3b6db5fe39ca60aa84943269cd170043b35a5f;hpb=2f9d6ffda78725e11b351a7a5d69414a32010810;p=ffmpeg diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index da3b6db5fe3..b8c4667a4ef 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -20,6 +20,7 @@ */ #include "avformat.h" +#include "internal.h" #include "riff.h" #include "isom.h" #include "matroska.h" @@ -33,9 +34,9 @@ #include "libavutil/random_seed.h" #include "libavutil/lfg.h" #include "libavutil/dict.h" +#include "libavutil/avstring.h" #include "libavcodec/xiph.h" #include "libavcodec/mpeg4audio.h" -#include typedef struct ebml_master { int64_t pos; ///< absolute offset in the file where the master's elements start @@ -317,9 +318,12 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead) currentpos = avio_tell(pb); - if (seekhead->reserved_size > 0) - if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) - return -1; + if (seekhead->reserved_size > 0) { + if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) { + currentpos = -1; + goto fail; + } + } metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size); for (i = 0; i < seekhead->num_entries; i++) { @@ -343,6 +347,7 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead) currentpos = seekhead->filepos; } +fail: av_free(seekhead->entries); av_free(seekhead); @@ -423,7 +428,7 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecContex else first_header_size = 42; - if (ff_split_xiph_headers(codec->extradata, codec->extradata_size, + if (avpriv_split_xiph_headers(codec->extradata, codec->extradata_size, first_header_size, header_start, header_len) < 0) { av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n"); return -1; @@ -443,7 +448,8 @@ static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int { MPEG4AudioConfig mp4ac; - if (ff_mpeg4audio_get_config(&mp4ac, codec->extradata, codec->extradata_size) < 0) { + if (avpriv_mpeg4audio_get_config(&mp4ac, codec->extradata, + codec->extradata_size * 8, 1) < 0) { av_log(s, AV_LOG_WARNING, "Error parsing AAC extradata, unable to determine samplerate.\n"); return; } @@ -574,7 +580,10 @@ static int mkv_write_tracks(AVFormatContext *s) switch (codec->codec_type) { case AVMEDIA_TYPE_VIDEO: put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); - put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9); + if(st->avg_frame_rate.num && st->avg_frame_rate.den && 1.0/av_q2d(st->avg_frame_rate) > av_q2d(codec->time_base)) + put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1E9/av_q2d(st->avg_frame_rate)); + else + put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9); if (!native_id && ff_codec_get_tag(codec_movvideo_tags, codec->codec_id) && @@ -665,7 +674,7 @@ static int mkv_write_tracks(AVFormatContext *s) end_ebml_master(pb, track); // ms precision is the de-facto standard timescale for mkv files - av_set_pts_info(st, 64, 1, 1000); + avpriv_set_pts_info(st, 64, 1, 1000); } end_ebml_master(pb, tracks); return 0; @@ -767,7 +776,7 @@ static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int eleme end_ebml_master(s->pb, targets); while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) - if (strcasecmp(t->key, "title") && strcasecmp(t->key, "stereo_mode")) + if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode")) mkv_write_simpletag(s->pb, t); end_ebml_master(s->pb, tag);