avcodec/crystalhd: Another attempt at using mpeg4_unpack_bframes bsf
I tried doing this before, but it resulted in weird behaviour with certain samples. I want to say I think I've got it sorted out now, and the new autobsf stuff makes it trivial to turn on. The native support for packed bframes is buggy and I think buggy in ways beyond what I already try to account for, so this should be a net improvements.
This commit is contained in:
parent
181aa1be49
commit
dd49eff930
@ -101,7 +101,6 @@ typedef struct {
|
|||||||
|
|
||||||
/* Options */
|
/* Options */
|
||||||
uint32_t sWidth;
|
uint32_t sWidth;
|
||||||
uint8_t bframe_bug;
|
|
||||||
} CHDContext;
|
} CHDContext;
|
||||||
|
|
||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
@ -631,16 +630,6 @@ static inline CopyRet receive_frame(AVCodecContext *avctx,
|
|||||||
} else if (ret == BC_STS_SUCCESS) {
|
} else if (ret == BC_STS_SUCCESS) {
|
||||||
int copy_ret = -1;
|
int copy_ret = -1;
|
||||||
if (output.PoutFlags & BC_POUT_FLAGS_PIB_VALID) {
|
if (output.PoutFlags & BC_POUT_FLAGS_PIB_VALID) {
|
||||||
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");
|
|
||||||
}
|
|
||||||
DtsReleaseOutputBuffs(dev, NULL, FALSE);
|
|
||||||
return RET_COPY_AGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
print_frame_info(priv, &output);
|
print_frame_info(priv, &output);
|
||||||
|
|
||||||
copy_ret = copy_frame(avctx, &output, frame, got_frame);
|
copy_ret = copy_frame(avctx, &output, frame, got_frame);
|
||||||
@ -675,21 +664,6 @@ static int crystalhd_decode_packet(AVCodecContext *avctx, const AVPacket *avpkt)
|
|||||||
|
|
||||||
if (avpkt && avpkt->size) {
|
if (avpkt && avpkt->size) {
|
||||||
uint64_t pts;
|
uint64_t pts;
|
||||||
if (!priv->bframe_bug && (avpkt->size == 6 || avpkt->size == 7)) {
|
|
||||||
/*
|
|
||||||
* Drop frames trigger the bug
|
|
||||||
*/
|
|
||||||
av_log(avctx, AV_LOG_WARNING,
|
|
||||||
"CrystalHD: Enabling work-around for packed b-frame bug\n");
|
|
||||||
priv->bframe_bug = 1;
|
|
||||||
} else if (priv->bframe_bug && avpkt->size == 8) {
|
|
||||||
/*
|
|
||||||
* Delay frames don't trigger the bug
|
|
||||||
*/
|
|
||||||
av_log(avctx, AV_LOG_WARNING,
|
|
||||||
"CrystalHD: Disabling work-around for packed b-frame bug\n");
|
|
||||||
priv->bframe_bug = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Despite being notionally opaque, either libcrystalhd or
|
* Despite being notionally opaque, either libcrystalhd or
|
||||||
@ -825,7 +799,7 @@ DEFINE_CRYSTALHD_DECODER(mpeg2, MPEG2VIDEO, NULL)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_MPEG4_CRYSTALHD_DECODER
|
#if CONFIG_MPEG4_CRYSTALHD_DECODER
|
||||||
DEFINE_CRYSTALHD_DECODER(mpeg4, MPEG4, NULL)
|
DEFINE_CRYSTALHD_DECODER(mpeg4, MPEG4, "mpeg4_unpack_bframes")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_MSMPEG4_CRYSTALHD_DECODER
|
#if CONFIG_MSMPEG4_CRYSTALHD_DECODER
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user