mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-03 05:10:03 +02:00
lavc/utils: Add support for discarding samples from the end
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@google.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
bf5ceeffc3
commit
889bc79b5f
@ -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 && discard_padding <= frame->nb_samples && *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;
|
||||
}
|
||||
}
|
||||
|
||||
avctx->pkt = NULL;
|
||||
if (did_split) {
|
||||
av_packet_free_side_data(&tmp);
|
||||
|
Loading…
Reference in New Issue
Block a user