mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-10-07 01:36:16 +08:00
avcodec: add AV_CODEC_FLAG_DROPCHANGED to flags
Discard decoded frames which differ from first decoded frame in stream.
This commit is contained in:
@@ -740,7 +740,7 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
|
||||
int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
{
|
||||
AVCodecInternal *avci = avctx->internal;
|
||||
int ret;
|
||||
int ret, changed;
|
||||
|
||||
av_frame_unref(frame);
|
||||
|
||||
@@ -765,6 +765,51 @@ int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
|
||||
|
||||
avctx->frame_number++;
|
||||
|
||||
if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) {
|
||||
|
||||
if (avctx->frame_number == 1) {
|
||||
avci->initial_format = frame->format;
|
||||
switch(avctx->codec_type) {
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
avci->initial_width = frame->width;
|
||||
avci->initial_height = frame->height;
|
||||
break;
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
avci->initial_sample_rate = frame->sample_rate ? frame->sample_rate :
|
||||
avctx->sample_rate;
|
||||
avci->initial_channels = frame->channels;
|
||||
avci->initial_channel_layout = frame->channel_layout;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (avctx->frame_number > 1) {
|
||||
changed = avci->initial_format != frame->format;
|
||||
|
||||
switch(avctx->codec_type) {
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
changed |= avci->initial_width != frame->width ||
|
||||
avci->initial_height != frame->height;
|
||||
break;
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
changed |= avci->initial_sample_rate != frame->sample_rate ||
|
||||
avci->initial_sample_rate != avctx->sample_rate ||
|
||||
avci->initial_channels != frame->channels ||
|
||||
avci->initial_channel_layout != frame->channel_layout;
|
||||
break;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
avci->changed_frames_dropped++;
|
||||
av_log(avctx, AV_LOG_INFO, "dropped changed frame #%d pts %"PRId64
|
||||
" drop count: %d \n",
|
||||
avctx->frame_number, frame->pts,
|
||||
avci->changed_frames_dropped);
|
||||
av_frame_unref(frame);
|
||||
return AVERROR_INPUT_CHANGED;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user