summaryrefslogtreecommitdiff
path: root/libavformat/matroskaenc.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-03-08 17:28:42 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-03-08 19:12:03 +0100
commit2653e125204569b1e9439ee2671c6ebb23a94b80 (patch)
tree4176f76bccc8cdd1c85b9d329a82867eda37d397 /libavformat/matroskaenc.c
parent532f31a695c9530ce67a847be00d72e6e8acfd11 (diff)
parent1afddbe59e96af75f1c07605afc95615569f388f (diff)
Merge commit '1afddbe59e96af75f1c07605afc95615569f388f'
* commit '1afddbe59e96af75f1c07605afc95615569f388f': avpacket: use AVBuffer to allow refcounting the packets. Conflicts: libavcodec/avpacket.c libavcodec/utils.c libavdevice/v4l2.c libavformat/avidec.c libavformat/flacdec.c libavformat/id3v2.c libavformat/matroskaenc.c libavformat/mux.c libavformat/utils.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r--libavformat/matroskaenc.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 4544f8e871..a151eef457 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -92,7 +92,6 @@ typedef struct MatroskaMuxContext {
mkv_cues *cues;
mkv_track *tracks;
- unsigned int audio_buffer_size;
AVPacket cur_audio_pkt;
int have_attachments;
@@ -1043,7 +1042,6 @@ static int mkv_write_header(AVFormatContext *s)
av_init_packet(&mkv->cur_audio_pkt);
mkv->cur_audio_pkt.size = 0;
- mkv->audio_buffer_size = 0;
mkv->cluster_pos = -1;
avio_flush(pb);
@@ -1262,19 +1260,6 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
return 0;
}
-static int mkv_copy_packet(MatroskaMuxContext *mkv, const AVPacket *pkt)
-{
- uint8_t *data = mkv->cur_audio_pkt.data;
- mkv->cur_audio_pkt = *pkt;
- mkv->cur_audio_pkt.data = av_fast_realloc(data, &mkv->audio_buffer_size, pkt->size);
- if (!mkv->cur_audio_pkt.data)
- return AVERROR(ENOMEM);
-
- memcpy(mkv->cur_audio_pkt.data, pkt->data, pkt->size);
- mkv->cur_audio_pkt.size = pkt->size;
- return 0;
-}
-
static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
{
MatroskaMuxContext *mkv = s->priv_data;
@@ -1301,7 +1286,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
// check if we have an audio packet cached
if (mkv->cur_audio_pkt.size > 0) {
ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
- mkv->cur_audio_pkt.size = 0;
+ av_free_packet(&mkv->cur_audio_pkt);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
return ret;
@@ -1310,9 +1295,11 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
// buffer an audio packet to ensure the packet containing the video
// keyframe's timecode is contained in the same cluster for WebM
- if (codec->codec_type == AVMEDIA_TYPE_AUDIO)
- ret = mkv_copy_packet(mkv, pkt);
- else
+ if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
+ mkv->cur_audio_pkt = *pkt;
+ mkv->cur_audio_pkt.buf = av_buffer_ref(pkt->buf);
+ ret = mkv->cur_audio_pkt.buf ? 0 : AVERROR(ENOMEM);
+ } else
ret = mkv_write_packet_internal(s, pkt);
return ret;
}
@@ -1327,7 +1314,7 @@ static int mkv_write_trailer(AVFormatContext *s)
// check if we have an audio packet cached
if (mkv->cur_audio_pkt.size > 0) {
ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
- mkv->cur_audio_pkt.size = 0;
+ av_free_packet(&mkv->cur_audio_pkt);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
return ret;
@@ -1364,7 +1351,6 @@ static int mkv_write_trailer(AVFormatContext *s)
av_free(mkv->tracks);
av_freep(&mkv->cues->entries);
av_freep(&mkv->cues);
- av_destruct_packet(&mkv->cur_audio_pkt);
return 0;
}