[FFmpeg-devel] [PATCH] lavc/utils: Add support for discarding samples from the end
Vignesh Venkatasubramanian
vigneshv at google.com
Tue Sep 10 20:17:33 CEST 2013
On Tue, Sep 10, 2013 at 11:08 AM, Vignesh Venkatasubramanian
<vigneshv at google.com> wrote:
> Adding support for discarding samples from the end based on the value in
> AV_PKT_DATA_SKIP_SAMPLES side data's bytes 5-8.
>
> Signed-off By: Vignesh Venkatasubramanian <vigneshv at google.com>
> ---
> libavcodec/utils.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 7f361ef..1b1bc4d 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -2112,6 +2112,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
> if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {
> uint8_t *side;
> int side_size;
> + uint32_t discard_padding = 0;
> // copy to ensure we do not change avpkt
> AVPacket tmp = *avpkt;
> int did_split = av_packet_split_side_data(&tmp);
> @@ -2146,6 +2147,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
> avctx->internal->skip_samples = AV_RL32(side);
> av_log(avctx, AV_LOG_DEBUG, "skip %d samples due to side data\n",
> avctx->internal->skip_samples);
> + discard_padding = AV_RL32(side + 4);
> }
> if (avctx->internal->skip_samples && *got_frame_ptr) {
> if(frame->nb_samples <= avctx->internal->skip_samples){
> @@ -2176,6 +2178,25 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
> }
> }
>
> + if (discard_padding > 0 && *got_frame_ptr) {
> + if (discard_padding == frame->nb_samples) {
> + *got_frame_ptr = 0;
> + } else {
> + if(avctx->pkt_timebase.num && avctx->sample_rate) {
> + int64_t diff_ts = av_rescale_q(frame->nb_samples - discard_padding,
> + (AVRational){1, avctx->sample_rate},
> + avctx->pkt_timebase);
> + if (av_frame_get_pkt_duration(frame) >= diff_ts)
> + av_frame_set_pkt_duration(frame, av_frame_get_pkt_duration(frame) - diff_ts);
> + } else {
> + av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for discarded samples.\n");
> + }
> + av_log(avctx, AV_LOG_DEBUG, "discard %d/%d samples\n",
> + discard_padding, frame->nb_samples);
> + frame->nb_samples -= discard_padding;
the earlier comment on this was: "use of untrusted and unchecked
values for changing array dimensions". could
you please tell me how to check the value? I am doing pretty much the
same thing as
avctx->internal->skip_samples in the previous block.
> + }
> + }
> +
> avctx->pkt = NULL;
> if (did_split) {
> av_packet_free_side_data(&tmp);
> --
> 1.8.4
>
More information about the ffmpeg-devel
mailing list