diff mbox

[FFmpeg-devel] libavformat/mov: Fix inserting frames before current_frame.

Message ID 20170727173432.45471-1-modmaker@google.com
State Accepted
Commit f4544163b27615ecfff1b42d6acdb3672ac92399
Headers show

Commit Message

Jacob Trimble July 27, 2017, 5:34 p.m. UTC
When using streaming input, it may be possible to see frames that appear
before the current_frame.  When these frames are inserted into the
index, the current_frame needs to be updated so it is still pointing
at the same frame.

Signed-off-by: Jacob Trimble <modmaker@google.com>
---
 libavformat/mov.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

Comments

Jacob Trimble Aug. 7, 2017, 4:24 p.m. UTC | #1
Ping

On Thu, Jul 27, 2017 at 10:34 AM, Jacob Trimble <modmaker@google.com> wrote:
> When using streaming input, it may be possible to see frames that appear
> before the current_frame.  When these frames are inserted into the
> index, the current_frame needs to be updated so it is still pointing
> at the same frame.
>
> Signed-off-by: Jacob Trimble <modmaker@google.com>
> ---
>  libavformat/mov.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 63f84be782..d039f27063 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -4259,7 +4259,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>      int64_t dts;
>      int data_offset = 0;
>      unsigned entries, first_sample_flags = frag->flags;
> -    int flags, distance, i, err;
> +    int flags, distance, i, err, old_nb_index_entries;
>
>      for (i = 0; i < c->fc->nb_streams; i++) {
>          if (c->fc->streams[i]->id == frag->track_id) {
> @@ -4352,13 +4352,19 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>                                    MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
>          if (keyframe)
>              distance = 0;
> +        old_nb_index_entries = st->nb_index_entries;
>          err = av_add_index_entry(st, offset, dts, sample_size, distance,
>                                   keyframe ? AVINDEX_KEYFRAME : 0);
>          if (err < 0) {
>              av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");
> +        } else if (err <= sc->current_sample && err + 1 != st->nb_index_entries &&
> +            st->nb_index_entries != old_nb_index_entries) {
> +            // if we inserted a new item before the current sample, move the
> +            // counter ahead so it is still pointing to the same sample.
> +            sc->current_sample++;
>          }
> -        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %u, offset %"PRIx64", dts %"PRId64", "
> -                "size %u, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
> +        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
> +                "size %u, distance %d, keyframe %d\n", st->index, err,
>                  offset, dts, sample_size, distance, keyframe);
>          distance++;
>          dts += sample_duration;
Jacob Trimble Aug. 17, 2017, 8:40 p.m. UTC | #2
On Mon, Aug 7, 2017 at 9:24 AM, Jacob Trimble <modmaker@google.com> wrote:
> Ping
>
> On Thu, Jul 27, 2017 at 10:34 AM, Jacob Trimble <modmaker@google.com> wrote:
>> When using streaming input, it may be possible to see frames that appear
>> before the current_frame.  When these frames are inserted into the
>> index, the current_frame needs to be updated so it is still pointing
>> at the same frame.
>>
>> Signed-off-by: Jacob Trimble <modmaker@google.com>
>> ---
>>  libavformat/mov.c | 12 +++++++++---
>>  1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index 63f84be782..d039f27063 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -4259,7 +4259,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>      int64_t dts;
>>      int data_offset = 0;
>>      unsigned entries, first_sample_flags = frag->flags;
>> -    int flags, distance, i, err;
>> +    int flags, distance, i, err, old_nb_index_entries;
>>
>>      for (i = 0; i < c->fc->nb_streams; i++) {
>>          if (c->fc->streams[i]->id == frag->track_id) {
>> @@ -4352,13 +4352,19 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>                                    MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
>>          if (keyframe)
>>              distance = 0;
>> +        old_nb_index_entries = st->nb_index_entries;
>>          err = av_add_index_entry(st, offset, dts, sample_size, distance,
>>                                   keyframe ? AVINDEX_KEYFRAME : 0);
>>          if (err < 0) {
>>              av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");
>> +        } else if (err <= sc->current_sample && err + 1 != st->nb_index_entries &&
>> +            st->nb_index_entries != old_nb_index_entries) {
>> +            // if we inserted a new item before the current sample, move the
>> +            // counter ahead so it is still pointing to the same sample.
>> +            sc->current_sample++;
>>          }
>> -        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %u, offset %"PRIx64", dts %"PRId64", "
>> -                "size %u, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
>> +        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
>> +                "size %u, distance %d, keyframe %d\n", st->index, err,
>>                  offset, dts, sample_size, distance, keyframe);
>>          distance++;
>>          dts += sample_duration;

Ping again.  I have been waiting 20 days.  Someone please take a look!!
Michael Niedermayer Aug. 18, 2017, 1:04 a.m. UTC | #3
On Thu, Jul 27, 2017 at 10:34:32AM -0700, Jacob Trimble wrote:
> When using streaming input, it may be possible to see frames that appear
> before the current_frame.  When these frames are inserted into the
> index, the current_frame needs to be updated so it is still pointing
> at the same frame.
> 
> Signed-off-by: Jacob Trimble <modmaker@google.com>
> ---
>  libavformat/mov.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)

applied

thanks

[...]
diff mbox

Patch

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 63f84be782..d039f27063 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -4259,7 +4259,7 @@  static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     int64_t dts;
     int data_offset = 0;
     unsigned entries, first_sample_flags = frag->flags;
-    int flags, distance, i, err;
+    int flags, distance, i, err, old_nb_index_entries;
 
     for (i = 0; i < c->fc->nb_streams; i++) {
         if (c->fc->streams[i]->id == frag->track_id) {
@@ -4352,13 +4352,19 @@  static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
                                   MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
         if (keyframe)
             distance = 0;
+        old_nb_index_entries = st->nb_index_entries;
         err = av_add_index_entry(st, offset, dts, sample_size, distance,
                                  keyframe ? AVINDEX_KEYFRAME : 0);
         if (err < 0) {
             av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");
+        } else if (err <= sc->current_sample && err + 1 != st->nb_index_entries &&
+            st->nb_index_entries != old_nb_index_entries) {
+            // if we inserted a new item before the current sample, move the
+            // counter ahead so it is still pointing to the same sample.
+            sc->current_sample++;
         }
-        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %u, offset %"PRIx64", dts %"PRId64", "
-                "size %u, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
+        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
+                "size %u, distance %d, keyframe %d\n", st->index, err,
                 offset, dts, sample_size, distance, keyframe);
         distance++;
         dts += sample_duration;