diff --git a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp b/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp index ff31439af29..94735a86976 100644 --- a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp @@ -12,6 +12,7 @@ #include "MediaInfo.h" #include "FFmpegH264Decoder.h" +#include "FFmpegLog.h" #define GECKO_FRAME_TYPE 0x00093CC0 @@ -49,6 +50,20 @@ FFmpegH264Decoder::Init() return NS_OK; } +int64_t +FFmpegH264Decoder::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::DecodeResult FFmpegH264Decoder::DoDecodeFrame(MediaRawData* aSample) { @@ -68,10 +83,19 @@ FFmpegH264Decoder::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::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::DoDecodeFrame(MediaRawData* aSample) nsRefPtr v = VideoData::Create(info, mImageContainer, aSample->mOffset, - mFrame->pkt_pts, + pts, aSample->mDuration, b, aSample->mKeyframe, diff --git a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.h b/dom/media/platforms/ffmpeg/FFmpegH264Decoder.h index 82d5329b9a8..0ff1f5bed42 100644 --- a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.h +++ b/dom/media/platforms/ffmpeg/FFmpegH264Decoder.h @@ -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 mImageContainer;