[01/10] lavf: Don't interpret just slightly broken timestamps as wraparound

Message ID 1375038091-92151-1-git-send-email-martin@martin.st
State Committed
Commit c5b46a064d9991f2cd045c90179fccf35ecffc34
Headers show

Commit Message

Martin Storsjö July 28, 2013, 7:01 p.m.
From: Michael Niedermayer <michaelni@gmx.at>

This avoids breaking some slightly incorrect (dts > pts) timestamps
in sample HLS streams from Apple.
---
 libavformat/utils.c |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Luca Barbato July 28, 2013, 7:52 p.m. | #1
On 28/07/13 21:01, Martin Storsjö wrote:
> From: Michael Niedermayer <michaelni@gmx.at>
> 
> This avoids breaking some slightly incorrect (dts > pts) timestamps
> in sample HLS streams from Apple.
> ---
>  libavformat/utils.c |    5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index 80b1ce2..3a11239 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -727,8 +727,9 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
>          pc && pc->pict_type != AV_PICTURE_TYPE_B)
>          presentation_delayed = 1;
>  
> -    if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
> -       /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
> +    if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
> +        st->pts_wrap_bits < 63 &&
> +        pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
>          pkt->dts -= 1LL<<st->pts_wrap_bits;
>      }

Given that there is some sample out that would be fixed and hopefully it
is less likely to break valid streams, ok.

lu

Patch

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 80b1ce2..3a11239 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -727,8 +727,9 @@  static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
         pc && pc->pict_type != AV_PICTURE_TYPE_B)
         presentation_delayed = 1;
 
-    if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
-       /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
+    if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
+        st->pts_wrap_bits < 63 &&
+        pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
         pkt->dts -= 1LL<<st->pts_wrap_bits;
     }