All pastes #1589589 Raw Edit

Stuff

public text v1 · immutable
#1589589 ·published 2009-10-02 15:25 UTC
rendered paste body
Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 22174)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -2140,6 +2140,8 @@
 
     pic->age = 256 * 256 * 256 * 64;
 
+    pic->reordered_opaque= c->reordered_opaque;
+
     return 1;
 }
 
@@ -2286,6 +2288,8 @@
     render->state |= FF_VDPAU_STATE_USED_FOR_REFERENCE;
 #endif
 
+    pic->reordered_opaque= c->reordered_opaque;
+
     return 0;
 }
 
@@ -3854,8 +3858,7 @@
                     }
 
                     AVCodecContext *context = curstream->codec;
-                    AVFrame mpa_pic;
-                    bzero(&mpa_pic, sizeof(AVFrame));
+                    AVFrame *mpa_pic= avcodec_alloc_frame();
 
                     int gotpicture = 0;
 
@@ -3868,24 +3871,25 @@
                             // HACK
                             while (!gotpicture && count < 5)
                             {
-                                ret = d->DecodeMPEG2Video(context, &mpa_pic,
+                                ret = d->DecodeMPEG2Video(context, mpa_pic,
                                                   &gotpicture, ptr, len);
                                 count++;
                             }
                         }
                         else
                         {
-                            ret = d->DecodeMPEG2Video(context, &mpa_pic,
+                            ret = d->DecodeMPEG2Video(context, mpa_pic,
                                                 &gotpicture, ptr, len);
                         }
                     }
                     else
                     {
-                        ret = avcodec_decode_video(context, &mpa_pic,
+                        curstream->codec->reordered_opaque= pkt->pts;
+                        ret = avcodec_decode_video(context, mpa_pic,
                                                    &gotpicture, ptr, len);
                         // Reparse it to not drop the DVD still frame
                         if (decodeStillFrame)
-                            ret = avcodec_decode_video(context, &mpa_pic,
+                            ret = avcodec_decode_video(context, mpa_pic,
                                                         &gotpicture, ptr, len);
                     }
                     avcodeclock.unlock();
@@ -3906,21 +3910,21 @@
                     }
 
                     // Decode ATSC captions
-                    for (uint i = 0; i < (uint)mpa_pic.atsc_cc_len;
-                         i += ((mpa_pic.atsc_cc_buf[i] & 0x1f) * 3) + 2)
+                    for (uint i = 0; i < (uint)mpa_pic->atsc_cc_len;
+                         i += ((mpa_pic->atsc_cc_buf[i] & 0x1f) * 3) + 2)
                     {
-                        DecodeDTVCC(mpa_pic.atsc_cc_buf + i);
+                        DecodeDTVCC(mpa_pic->atsc_cc_buf + i);
                     }
 
                     // Decode DVB captions from MPEG user data
-                    if (mpa_pic.dvb_cc_len > 0)
+                    if (mpa_pic->dvb_cc_len > 0)
                     {
                         unsigned long long utc = lastccptsu;
 
-                        for (uint i = 0; i < (uint)mpa_pic.dvb_cc_len; i += 2)
+                        for (uint i = 0; i < (uint)mpa_pic->dvb_cc_len; i += 2)
                         {
-                            uint8_t cc_lo = mpa_pic.dvb_cc_buf[i];
-                            uint8_t cc_hi = mpa_pic.dvb_cc_buf[i+1];
+                            uint8_t cc_lo = mpa_pic->dvb_cc_buf[i];
+                            uint8_t cc_hi = mpa_pic->dvb_cc_buf[i+1];
 
                             uint16_t cc_dt = (cc_hi << 8) | cc_lo;
 
@@ -3933,7 +3937,7 @@
                         lastccptsu = utc;
                     }
 
-                    VideoFrame *picframe = (VideoFrame *)(mpa_pic.opaque);
+                    VideoFrame *picframe = (VideoFrame *)(mpa_pic->opaque);
 
                     if (!directrendering)
                     {
@@ -3952,7 +3956,7 @@
 
                         myth_sws_img_convert(
                             &tmppicture, PIX_FMT_YUV420P,
-                                    (AVPicture *)&mpa_pic,
+                                    (AVPicture *)mpa_pic,
                                     context->pix_fmt,
                                     context->width,
                                     context->height);
@@ -3961,18 +3965,32 @@
                         {
                             // Set the frame flags, but then discard it
                             // since we are not using it for display.
-                            xf->interlaced_frame = mpa_pic.interlaced_frame;
-                            xf->top_field_first = mpa_pic.top_field_first;
+                            xf->interlaced_frame = mpa_pic->interlaced_frame;
+                            xf->top_field_first = mpa_pic->top_field_first;
                             xf->frameNumber = framesPlayed;
                             GetNVP()->DiscardVideoFrame(xf);
                         }
                     }
 
+                    int decoder_reorder_pts = 1;
+                    if(   (decoder_reorder_pts || pkt->dts == AV_NOPTS_VALUE)
+                       && mpa_pic->reordered_opaque != AV_NOPTS_VALUE) {
+                        pts= (long long)mpa_pic->reordered_opaque;
+                    }
+                    else if(pkt->dts != (int64_t)AV_NOPTS_VALUE) {
+                        pts= (long long)pkt->dts;
+                    }
+                    else {
+                        pts= 0;
+                    }
+                    pts = (long long)(av_q2d(curstream->time_base) * pts * 1000);
+
                     long long temppts = pts;
 
                     // Validate the video pts against the last pts. If it's
                     // a little bit smaller or equal, compute it from the last.
                     // Otherwise assume a wraparound.
+#if 0
                     if (!ringBuffer->isDVD() &&
                         temppts <= lastvpts &&
                         (temppts + 10000 > lastvpts || temppts < 0))
@@ -3980,9 +3998,10 @@
                         temppts = lastvpts;
                         temppts += (long long)(1000 * av_q2d(context->time_base));
                         // MPEG2 frames can be repeated, update pts accordingly
-                        temppts += (long long)(mpa_pic.repeat_pict * 500
+                        temppts += (long long)(mpa_pic->repeat_pict * 500
                                       * av_q2d(curstream->codec->time_base));
                     }
+#endif
 
                     VERBOSE(VB_PLAYBACK+VB_TIMESTAMP, LOC +
                             QString("video timecode %1 %2 %3 %4")
@@ -3990,34 +4009,34 @@
                             .arg(lastvpts));
 
 /* XXX: Broken.
-                    if (mpa_pic.qscale_table != NULL && mpa_pic.qstride > 0 &&
+                    if (mpa_pic->qscale_table != NULL && mpa_pic->qstride > 0 &&
                         context->height == picframe->height)
                     {
-                        int tblsize = mpa_pic.qstride *
+                        int tblsize = mpa_pic->qstride *
                                       ((picframe->height + 15) / 16);
 
-                        if (picframe->qstride != mpa_pic.qstride ||
+                        if (picframe->qstride != mpa_pic->qstride ||
                             picframe->qscale_table == NULL)
                         {
-                            picframe->qstride = mpa_pic.qstride;
+                            picframe->qstride = mpa_pic->qstride;
                             if (picframe->qscale_table)
                                 delete [] picframe->qscale_table;
                             picframe->qscale_table = new unsigned char[tblsize];
                         }
 
-                        memcpy(picframe->qscale_table, mpa_pic.qscale_table,
+                        memcpy(picframe->qscale_table, mpa_pic->qscale_table,
                                tblsize);
                     }
 */
 
-                    picframe->interlaced_frame = mpa_pic.interlaced_frame;
-                    picframe->top_field_first = mpa_pic.top_field_first;
-                    picframe->repeat_pict = mpa_pic.repeat_pict;
+                    picframe->interlaced_frame = mpa_pic->interlaced_frame;
+                    picframe->top_field_first = mpa_pic->top_field_first;
+                    picframe->repeat_pict = mpa_pic->repeat_pict;
 
                     picframe->frameNumber = framesPlayed;
                     GetNVP()->ReleaseNextVideoFrame(picframe, temppts);
-                    if (d->HasMPEG2Dec() && mpa_pic.data[3])
-                        context->release_buffer(context, &mpa_pic);
+                    if (d->HasMPEG2Dec() && mpa_pic->data[3])
+                        context->release_buffer(context, mpa_pic);
 
                     decoded_video_frame = picframe;
                     gotvideo = 1;