mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-09-16 03:44:15 +02:00
crystalhd: We don't need the track the last picture number anymore
This was needed to detect an interlaced failure case that doesn't happen with the new decode api.
This commit is contained in:
parent
badce88fdf
commit
89ba55dc0d
@ -133,8 +133,6 @@ typedef struct {
|
||||
uint8_t is_nal;
|
||||
uint8_t need_second_field;
|
||||
|
||||
uint64_t last_picture;
|
||||
|
||||
OpaqueList *head;
|
||||
OpaqueList *tail;
|
||||
|
||||
@ -310,7 +308,6 @@ static void flush(AVCodecContext *avctx)
|
||||
{
|
||||
CHDContext *priv = avctx->priv_data;
|
||||
|
||||
priv->last_picture = -1;
|
||||
priv->need_second_field = 0;
|
||||
|
||||
av_frame_unref (priv->pic);
|
||||
@ -446,7 +443,6 @@ static av_cold int init(AVCodecContext *avctx)
|
||||
priv = avctx->priv_data;
|
||||
priv->avctx = avctx;
|
||||
priv->is_nal = avctx->extradata_size > 0 && *(avctx->extradata) == 1;
|
||||
priv->last_picture = -1;
|
||||
priv->pic = av_frame_alloc();
|
||||
|
||||
subtype = id2subtype(priv, avctx->codec->id);
|
||||
@ -609,19 +605,6 @@ static inline CopyRet copy_frame(AVCodecContext *avctx,
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we got a false negative for interlaced on the first field,
|
||||
* we will realise our mistake here when we see that the picture number is that
|
||||
* of the previous picture. We cannot recover the frame and should discard the
|
||||
* second field to keep the correct number of output frames.
|
||||
*/
|
||||
if (output->PicInfo.picture_number == priv->last_picture && !priv->need_second_field) {
|
||||
av_log(avctx, AV_LOG_WARNING,
|
||||
"Incorrectly guessed progressive frame. Discarding second field\n");
|
||||
/* Returning without providing a picture. */
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
interlaced = output->PicInfo.flags & VDEC_FLAG_INTERLACED_SRC;
|
||||
|
||||
av_log(avctx, AV_LOG_VERBOSE, "Interlaced state: %d\n",
|
||||
@ -786,42 +769,19 @@ static inline CopyRet receive_frame(AVCodecContext *avctx,
|
||||
} else if (ret == BC_STS_SUCCESS) {
|
||||
int copy_ret = -1;
|
||||
if (output.PoutFlags & BC_POUT_FLAGS_PIB_VALID) {
|
||||
if (priv->last_picture == -1) {
|
||||
/*
|
||||
* Init to one less, so that the incrementing code doesn't
|
||||
* need to be special-cased.
|
||||
*/
|
||||
priv->last_picture = output.PicInfo.picture_number - 1;
|
||||
}
|
||||
|
||||
if (avctx->codec->id == AV_CODEC_ID_MPEG4 &&
|
||||
output.PicInfo.timeStamp == 0 && priv->bframe_bug) {
|
||||
if (!priv->bframe_bug) {
|
||||
av_log(avctx, AV_LOG_VERBOSE,
|
||||
"CrystalHD: Not returning packed frame twice.\n");
|
||||
}
|
||||
priv->last_picture++;
|
||||
DtsReleaseOutputBuffs(dev, NULL, FALSE);
|
||||
return RET_COPY_AGAIN;
|
||||
}
|
||||
|
||||
print_frame_info(priv, &output);
|
||||
|
||||
if (priv->last_picture + 1 < output.PicInfo.picture_number) {
|
||||
av_log(avctx, AV_LOG_WARNING,
|
||||
"CrystalHD: Picture Number discontinuity\n");
|
||||
/*
|
||||
* XXX: I have no idea what the semantics of this situation
|
||||
* are so I don't even know if we've lost frames or which
|
||||
* ones.
|
||||
*/
|
||||
priv->last_picture = output.PicInfo.picture_number - 1;
|
||||
}
|
||||
|
||||
copy_ret = copy_frame(avctx, &output, data, got_frame);
|
||||
if (*got_frame > 0) {
|
||||
priv->last_picture++;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* An invalid frame has been consumed.
|
||||
|
Loading…
Reference in New Issue
Block a user