Skip to content

Commit

Permalink
dvdplayer: videocodec ffmpeg - fix timestamps and colorspace
Browse files Browse the repository at this point in the history
  • Loading branch information
FernetMenta committed Nov 12, 2014
1 parent bd7da38 commit c82ec77
Showing 1 changed file with 26 additions and 3 deletions.
29 changes: 26 additions & 3 deletions xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,14 @@ int CDVDVideoCodecFFmpeg::Decode(uint8_t* pData, int iSize, double dts, double p
av_init_packet(&avpkt);
avpkt.data = pData;
avpkt.size = iSize;
#define SET_PKT_TS(ts) \
if(ts != DVD_NOPTS_VALUE)\
avpkt.ts = (ts / DVD_TIME_BASE) * AV_TIME_BASE;\
else\
avpkt.ts = AV_NOPTS_VALUE
SET_PKT_TS(pts);
SET_PKT_TS(dts);
#undef SET_PKT_TS
/* We lie, but this flag is only used by pngdec.c.
* Setting it correctly would allow CorePNG decoding. */
avpkt.flags = AV_PKT_FLAG_KEY;
Expand Down Expand Up @@ -620,6 +628,7 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture)
pDvdVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location;
pDvdVideoPicture->color_primaries = m_pCodecContext->color_primaries;
pDvdVideoPicture->color_transfer = m_pCodecContext->color_trc;
pDvdVideoPicture->color_matrix = m_pCodecContext->colorspace;
if(m_pCodecContext->color_range == AVCOL_RANGE_JPEG
|| m_pCodecContext->pix_fmt == PIX_FMT_YUVJ420P)
pDvdVideoPicture->color_range = 1;
Expand All @@ -643,10 +652,24 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture)
pDvdVideoPicture->qscale_type = DVP_QSCALE_UNKNOWN;
}

pDvdVideoPicture->dts = m_dts;
if (pDvdVideoPicture->iRepeatPicture)
pDvdVideoPicture->dts = DVD_NOPTS_VALUE;
else
pDvdVideoPicture->dts = m_dts;

m_dts = DVD_NOPTS_VALUE;
if (m_pFrame->reordered_opaque)
pDvdVideoPicture->pts = pts_itod(m_pFrame->reordered_opaque);

int64_t bpts = av_frame_get_best_effort_timestamp(m_pFrame);
if(bpts != AV_NOPTS_VALUE)
{
pDvdVideoPicture->pts = (double)bpts * DVD_TIME_BASE / AV_TIME_BASE;
if (pDvdVideoPicture->pts == m_decoderPts)
{
pDvdVideoPicture->iRepeatPicture = -0.5;
pDvdVideoPicture->pts = DVD_NOPTS_VALUE;
pDvdVideoPicture->dts = DVD_NOPTS_VALUE;
}
}
else
pDvdVideoPicture->pts = DVD_NOPTS_VALUE;

Expand Down

0 comments on commit c82ec77

Please sign in to comment.