[FFmpeg-devel] Fix ctts_index calculation

Submitted by Xiaohan Wang (王消寒) on Feb. 3, 2018, 1:55 a.m.

Details

Message ID CAF1j9YNzOa9rv6+8zYPp4HZ1uG9xLA-A-0J4QaqjHghvLvQHFQ@mail.gmail.com
State New
Headers show

Commit Message

Xiaohan Wang (王消寒) Feb. 3, 2018, 1:55 a.m.

Comments

Michael Niedermayer Feb. 3, 2018, 8:36 p.m.
On Fri, Feb 02, 2018 at 05:55:38PM -0800, Xiaohan Wang (王消寒) wrote:
> 

>  mov.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 87157b4053de0e044e78db72ef13e8058075c235  0001-Fix-ctts_index-calculation.patch
> From bb376fd2de5da5f9ecdef41621a579252b899d7d Mon Sep 17 00:00:00 2001
> From: Xiaohan Wang <xhwang@chromium.org>
> Date: Fri, 2 Feb 2018 17:33:56 -0800
> Subject: [PATCH] Fix ctts_index calculation
> 
> An index should never be equal to the count. Hence we must make sure
> *ctts_index < ctts_count.
> ---
>  libavformat/mov.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

should be reviewed by sasi idealy, he wrote this

thx


[...]
Sasi Inguva Feb. 9, 2018, 8:26 p.m.
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 5adba52e08..f0bd3e3623 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -3148,7 +3148,7 @@ static int find_prev_closest_index(AVStream *st,
>          *ctts_index = 0;
>          *ctts_sample = 0;
>          for (index_ctts_count = 0; index_ctts_count < *index;
> index_ctts_count++) {
> -            if (*ctts_index < ctts_count) {

+            if (*ctts_index < ctts_count - 1) {
>
If you do this, then we are skipping, looking at ctts_samples in the last
ctts entry where (*ctts_index == ctts_count -1), which is not desired.

                 (*ctts_sample)++;
>                  if (ctts_data[*ctts_index].count == *ctts_sample) {
>                      (*ctts_index)++;
>

Here *ctts_index == ctts_count  only iff   the *ctts_index is the last CTTS
entry, and we still didn't reach   *index. That means that it's file with
CTTS truncated i.e. no corresponding CTTS entries for some STTS entries.
This issue can be fixed by checking for  *ctts_index <  ctts_count, in the
line after this loop.
while (*index
<https://cs.corp.google.com/piper///depot/google3/third_party/ffmpeg/next/libavformat/mov.c?l=3123&ct=xref_jump_to_def&gsn=index&rcl=184932376>
>= 0 && (*ctts_index
<https://cs.corp.google.com/piper///depot/google3/third_party/ffmpeg/next/libavformat/mov.c?l=3124&ct=xref_jump_to_def&gsn=ctts_index&rcl=184932376>)
>= 0) {
we already check for (*ctts_index) >=0 so we can check for the upper bound
too.

On Sat, Feb 3, 2018 at 12:36 PM, Michael Niedermayer <michael@niedermayer.cc
> wrote:

> On Fri, Feb 02, 2018 at 05:55:38PM -0800, Xiaohan Wang (王消寒) wrote:
> >
>
> >  mov.c |    2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 87157b4053de0e044e78db72ef13e8058075c235  0001-Fix-ctts_index-calculatio
> n.patch
> > From bb376fd2de5da5f9ecdef41621a579252b899d7d Mon Sep 17 00:00:00 2001
> > From: Xiaohan Wang <xhwang@chromium.org>
> > Date: Fri, 2 Feb 2018 17:33:56 -0800
> > Subject: [PATCH] Fix ctts_index calculation
> >
> > An index should never be equal to the count. Hence we must make sure
> > *ctts_index < ctts_count.
> > ---
> >  libavformat/mov.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
>
> should be reviewed by sasi idealy, he wrote this
>
> thx
>
>
> [...]
>
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Democracy is the form of government in which you can choose your dictator
>

Patch hide | download patch | download mbox

From bb376fd2de5da5f9ecdef41621a579252b899d7d Mon Sep 17 00:00:00 2001
From: Xiaohan Wang <xhwang@chromium.org>
Date: Fri, 2 Feb 2018 17:33:56 -0800
Subject: [PATCH] Fix ctts_index calculation

An index should never be equal to the count. Hence we must make sure
*ctts_index < ctts_count.
---
 libavformat/mov.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 5adba52e08..f0bd3e3623 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3148,7 +3148,7 @@  static int find_prev_closest_index(AVStream *st,
         *ctts_index = 0;
         *ctts_sample = 0;
         for (index_ctts_count = 0; index_ctts_count < *index; index_ctts_count++) {
-            if (*ctts_index < ctts_count) {
+            if (*ctts_index < ctts_count - 1) {
                 (*ctts_sample)++;
                 if (ctts_data[*ctts_index].count == *ctts_sample) {
                     (*ctts_index)++;
-- 
2.16.0.rc1.238.g530d649a79-goog