1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

CrystalHD: Add auto-detection of packed b-frame bug.

I still don't fully understand the cause but the difference between
the samples that trigger the bug and the samples that don't is
that the former uses delay frames and the later uses drop frames
as placeholders for the packed frame. So, if we see the one type
of frame, we can assume the bug will or won't be present.

Right now, I'm detecting the frame types by size, which may not be
safe in general, but given the specific codec and file type, I
expect any scenario where we encounter these frames where they
aren't being used for b-frame packing won't care one way or
another whether the work around is in effect or not.

Signed-off-by: Philip Langdale <philipl@overt.org>
This commit is contained in:
Philip Langdale 2011-04-20 21:43:29 -07:00
parent d5551265f3
commit 8de45adb37

View File

@ -142,6 +142,7 @@ typedef struct {
/* Options */ /* Options */
uint32_t sWidth; uint32_t sWidth;
uint8_t bframe_bug;
} CHDContext; } CHDContext;
static const AVOption options[] = { static const AVOption options[] = {
@ -744,7 +745,7 @@ static inline CopyRet receive_frame(AVCodecContext *avctx,
} }
if (avctx->codec->id == CODEC_ID_MPEG4 && if (avctx->codec->id == CODEC_ID_MPEG4 &&
output.PicInfo.timeStamp == 0) { output.PicInfo.timeStamp == 0 && priv->bframe_bug) {
av_log(avctx, AV_LOG_VERBOSE, av_log(avctx, AV_LOG_VERBOSE,
"CrystalHD: Not returning packed frame twice.\n"); "CrystalHD: Not returning packed frame twice.\n");
priv->last_picture++; priv->last_picture++;
@ -810,6 +811,22 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *a
av_log(avctx, AV_LOG_VERBOSE, "CrystalHD: decode_frame\n"); av_log(avctx, AV_LOG_VERBOSE, "CrystalHD: decode_frame\n");
if (avpkt->size == 7 && !priv->bframe_bug) {
/*
* The use of a drop frame triggers the bug
*/
av_log(avctx, AV_LOG_INFO,
"CrystalHD: Enabling work-around for packed b-frame bug\n");
priv->bframe_bug = 1;
} else if (avpkt->size == 8 && priv->bframe_bug) {
/*
* Delay frames don't trigger the bug
*/
av_log(avctx, AV_LOG_INFO,
"CrystalHD: Disabling work-around for packed b-frame bug\n");
priv->bframe_bug = 0;
}
if (len) { if (len) {
int32_t tx_free = (int32_t)DtsTxFreeSize(dev); int32_t tx_free = (int32_t)DtsTxFreeSize(dev);