[FFmpeg-soc] [soc]: r1093 - matroska/matroskaenc.c
conrad
subversion at mplayerhq.hu
Mon Aug 20 21:52:18 CEST 2007
Author: conrad
Date: Mon Aug 20 21:52:18 2007
New Revision: 1093
Log:
Write codecprivate to a dynamic buffer so that seeking isn't required
Modified:
matroska/matroskaenc.c
Modified: matroska/matroskaenc.c
==============================================================================
--- matroska/matroskaenc.c (original)
+++ matroska/matroskaenc.c Mon Aug 20 21:52:18 2007
@@ -388,7 +388,6 @@ static offset_t mkv_write_cues(ByteIOCon
static int put_xiph_codecpriv(ByteIOContext *pb, AVCodecContext *codec)
{
- ebml_master codecprivate;
uint8_t *header_start[3];
int header_len[3];
int first_header_size;
@@ -405,14 +404,12 @@ static int put_xiph_codecpriv(ByteIOCont
return -1;
}
- codecprivate = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
put_byte(pb, 2); // number packets - 1
for (j = 0; j < 2; j++) {
put_xiph_size(pb, header_len[j]);
}
for (j = 0; j < 3; j++)
put_buffer(pb, header_start[j], header_len[j]);
- end_ebml_master(pb, codecprivate);
return 0;
}
@@ -421,8 +418,6 @@ static int put_xiph_codecpriv(ByteIOCont
static int put_flac_codecpriv(ByteIOContext *pb, AVCodecContext *codec)
{
- ebml_master codecpriv = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
-
// if the extradata_size is greater than FLAC_STREAMINFO_SIZE,
// assume that it's in Matroska's format already
if (codec->extradata_size < FLAC_STREAMINFO_SIZE) {
@@ -435,7 +430,6 @@ static int put_flac_codecpriv(ByteIOCont
av_log(codec, AV_LOG_ERROR, "Only one packet\n");
}
put_buffer(pb, codec->extradata, codec->extradata_size);
- end_ebml_master(pb, codecpriv);
return 0;
}
@@ -472,42 +466,41 @@ static void get_aac_sample_rates(AVCodec
static int mkv_write_codecprivate(ByteIOContext *pb, AVCodecContext *codec, int native_id)
{
- int ret;
+ ByteIOContext dyn_cp;
+ uint8_t *codecpriv;
+ int ret = 0, codecpriv_size;
+
+ url_open_dyn_buf(&dyn_cp);
if (native_id) {
if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) {
- ret = put_xiph_codecpriv(pb, codec);
- if (ret < 0) return ret;
+ ret = put_xiph_codecpriv(&dyn_cp, codec);
} else if (codec->codec_id == CODEC_ID_FLAC) {
- ret = put_flac_codecpriv(pb, codec);
- if (ret < 0) return ret;
+ ret = put_flac_codecpriv(&dyn_cp, codec);
} else if (codec->extradata_size) {
- put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codec->extradata, codec->extradata_size);
+ put_buffer(&dyn_cp, codec->extradata, codec->extradata_size);
}
} else if (codec->codec_type == CODEC_TYPE_VIDEO) {
- ebml_master bmp_header;
-
if (!codec->codec_tag)
codec->codec_tag = codec_get_tag(codec_bmp_tags, codec->codec_id);
- bmp_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
- put_bmp_header(pb, codec, codec_bmp_tags, 0);
- end_ebml_master(pb, bmp_header);
+ put_bmp_header(&dyn_cp, codec, codec_bmp_tags, 0);
} else if (codec->codec_type == CODEC_TYPE_AUDIO) {
- ebml_master wav_header;
-
codec->codec_tag = codec_get_tag(codec_wav_tags, codec->codec_id);
if (!codec->codec_tag) {
av_log(codec, AV_LOG_ERROR, "no wav codec id found");
- return -1;
+ ret = -1;
}
- wav_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
- put_wav_header(pb, codec);
- end_ebml_master(pb, wav_header);
+ put_wav_header(&dyn_cp, codec);
}
- return 0;
+
+ codecpriv_size = url_close_dyn_buf(&dyn_cp, &codecpriv);
+ if (codecpriv_size)
+ put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size);
+ av_free(codecpriv);
+ return ret;
}
static int mkv_write_tracks(AVFormatContext *s)
More information about the FFmpeg-soc
mailing list