[FFmpeg-devel] [PATCH 1/2] opus/matroska: Adding support for DiscardPadding in muxer
Michael Niedermayer
michaelni at gmx.at
Fri Aug 30 02:29:56 CEST 2013
On Tue, Aug 20, 2013 at 03:13:36PM -0700, Vignesh Venkatasubramanian wrote:
> Support for end trimming Opus in Matroska is implemented by using
> the DiscardPadding container element in the Block data. The last
> chunk is stored as a Block instead of SimpleBlock and the
> trimming information is stored and used to discard samples that
> were padded by the Opus codec. This patch adds support for muxing
> DiscardPadding element into the container with appropriate value.
> Matroska spec for the DiscardPadding element can be found here:
> http://matroska.org/technical/specs/index.html#DiscardPadding
>
> Signed-off-by: Vignesh Venkatasubramanian <vigneshv at google.com>
> ---
> libavcodec/avpacket.c | 2 --
> libavcodec/libopusenc.c | 12 ++++++++++++
> libavformat/matroska.h | 1 +
> libavformat/matroskaenc.c | 24 ++++++++++++++++++++++--
> 4 files changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index 7196c31..ac761f1 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -225,8 +225,6 @@ int av_copy_packet_side_data(AVPacket *pkt, AVPacket *src)
> int i;
> DUP_DATA(pkt->side_data, src->side_data,
> src->side_data_elems * sizeof(*src->side_data), 0, ALLOC_MALLOC);
> - memset(pkt->side_data, 0,
> - src->side_data_elems * sizeof(*src->side_data));
> for (i = 0; i < src->side_data_elems; i++) {
> DUP_DATA(pkt->side_data[i].data, src->side_data[i].data,
> src->side_data[i].size, 1, ALLOC_MALLOC);
i see why you need this but simply removing the memset could leave
the packets in a invalid state on error conditions.
From a quick look this looks like it could then lead to double frees
Also this belongs in a seperate patch
> diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
> index 59caac7..775b2ef 100644
> --- a/libavcodec/libopusenc.c
> +++ b/libavcodec/libopusenc.c
> @@ -354,6 +354,18 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket *avpkt,
> ff_af_queue_remove(&opus->afq, opus->opts.packet_size,
> &avpkt->pts, &avpkt->duration);
>
> + if (opus->opts.packet_size - avpkt->duration > 0) {
could the subtraction overflow ?
> + uint8_t* side_data = av_packet_new_side_data(avpkt,
> + AV_PKT_DATA_SKIP_SAMPLES,
> + 10);
> + if(side_data == NULL) {
> + av_free_packet(avpkt);
> + av_free(avpkt);
> + return AVERROR(ENOMEM);
> + }
> + AV_WL32(side_data + 4, opus->opts.packet_size - avpkt->duration);
> + }
> +
> *got_packet_ptr = 1;
>
> return 0;
this too belongs in a seperate patch
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130830/30606576/attachment.asc>
More information about the ffmpeg-devel
mailing list