mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1159171: Part2. Fix pts calculations in older LibAV version. r=edwin
LibAV v0.8 always set the pts to 0 while the dts is set to the pts.
This commit is contained in:
parent
2be891d110
commit
cd5471d5c9
@ -12,6 +12,7 @@
|
||||
#include "MediaInfo.h"
|
||||
|
||||
#include "FFmpegH264Decoder.h"
|
||||
#include "FFmpegLog.h"
|
||||
|
||||
#define GECKO_FRAME_TYPE 0x00093CC0
|
||||
|
||||
@ -49,6 +50,20 @@ FFmpegH264Decoder<LIBAV_VER>::Init()
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
int64_t
|
||||
FFmpegH264Decoder<LIBAV_VER>::GetPts(const AVPacket& packet)
|
||||
{
|
||||
#if LIBAVCODEC_VERSION_MAJOR == 53
|
||||
if (mFrame->pkt_pts == 0) {
|
||||
return mFrame->pkt_dts;
|
||||
} else {
|
||||
return mFrame->pkt_pts;
|
||||
}
|
||||
#else
|
||||
return mFrame->pkt_pts;
|
||||
#endif
|
||||
}
|
||||
|
||||
FFmpegH264Decoder<LIBAV_VER>::DecodeResult
|
||||
FFmpegH264Decoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample)
|
||||
{
|
||||
@ -68,10 +83,19 @@ FFmpegH264Decoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample)
|
||||
return DecodeResult::DECODE_ERROR;
|
||||
}
|
||||
|
||||
// Required with old version of FFmpeg/LibAV
|
||||
mFrame->reordered_opaque = AV_NOPTS_VALUE;
|
||||
|
||||
int decoded;
|
||||
int bytesConsumed =
|
||||
avcodec_decode_video2(mCodecContext, mFrame, &decoded, &packet);
|
||||
|
||||
FFMPEG_LOG("DoDecodeFrame:decode_video: rv=%d decoded=%d "
|
||||
"(Input: pts(%lld) dts(%lld) Output: pts(%lld) "
|
||||
"opaque(%lld) pkt_pts(%lld) pkt_dts(%lld))",
|
||||
bytesConsumed, decoded, packet.pts, packet.dts, mFrame->pts,
|
||||
mFrame->reordered_opaque, mFrame->pkt_pts, mFrame->pkt_dts);
|
||||
|
||||
if (bytesConsumed < 0) {
|
||||
NS_WARNING("FFmpeg video decoder error.");
|
||||
mCallback->Error();
|
||||
@ -80,6 +104,10 @@ FFmpegH264Decoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample)
|
||||
|
||||
// If we've decoded a frame then we need to output it
|
||||
if (decoded) {
|
||||
int64_t pts = GetPts(packet);
|
||||
FFMPEG_LOG("Got one frame output with pts=%lld opaque=%lld",
|
||||
pts, mCodecContext->reordered_opaque);
|
||||
|
||||
VideoInfo info;
|
||||
info.mDisplay = nsIntSize(mDisplayWidth, mDisplayHeight);
|
||||
|
||||
@ -105,7 +133,7 @@ FFmpegH264Decoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample)
|
||||
nsRefPtr<VideoData> v = VideoData::Create(info,
|
||||
mImageContainer,
|
||||
aSample->mOffset,
|
||||
mFrame->pkt_pts,
|
||||
pts,
|
||||
aSample->mDuration,
|
||||
b,
|
||||
aSample->mKeyframe,
|
||||
|
@ -59,6 +59,7 @@ private:
|
||||
|
||||
static int AllocateBufferCb(AVCodecContext* aCodecContext, AVFrame* aFrame);
|
||||
static void ReleaseBufferCb(AVCodecContext* aCodecContext, AVFrame* aFrame);
|
||||
int64_t GetPts(const AVPacket& packet);
|
||||
|
||||
MediaDataDecoderCallback* mCallback;
|
||||
nsRefPtr<ImageContainer> mImageContainer;
|
||||
|
Loading…
Reference in New Issue
Block a user