]> granicus.if.org Git - libvpx/commitdiff
webmdec: Fix read_frame return value for calls after EOS
authorVignesh Venkatasubramanian <vigneshv@google.com>
Mon, 30 Mar 2015 19:58:26 +0000 (12:58 -0700)
committerVignesh Venkatasubramanian <vigneshv@google.com>
Mon, 30 Mar 2015 19:58:26 +0000 (12:58 -0700)
webm_read_frame assumes that it won't be called once end of file
is reached. But for frame parallel mode that turns out to be not
true. this patch fixes that behavior by checking for EOS and
returning the appropriate value for subsequent calls.

Change-Id: Ie2fddbe00493a0f96c4172c67be1eb719f0fe8ed

webmdec.cc
webmdec.h

index d591f3e3d7413f9b12b9f609eb31c79e958a95f8..60b01ad4b6e0aceb48016095096bfb27b44111f5 100644 (file)
@@ -63,6 +63,7 @@ int file_is_webm(struct WebmInputContext *webm_ctx,
                  struct VpxInputContext *vpx_ctx) {
   mkvparser::MkvReader *const reader = new mkvparser::MkvReader(vpx_ctx->file);
   webm_ctx->reader = reader;
+  webm_ctx->reached_eos = 0;
 
   mkvparser::EBMLHeader header;
   long long pos = 0;
@@ -121,6 +122,11 @@ int webm_read_frame(struct WebmInputContext *webm_ctx,
                     uint8_t **buffer,
                     size_t *bytes_in_buffer,
                     size_t *buffer_size) {
+  // This check is needed for frame parallel decoding, in which case this
+  // function could be called even after it has reached end of input stream.
+  if (webm_ctx->reached_eos) {
+    return 1;
+  }
   mkvparser::Segment *const segment =
       reinterpret_cast<mkvparser::Segment*>(webm_ctx->segment);
   const mkvparser::Cluster* cluster =
@@ -140,6 +146,7 @@ int webm_read_frame(struct WebmInputContext *webm_ctx,
       cluster = segment->GetNext(cluster);
       if (cluster == NULL || cluster->EOS()) {
         *bytes_in_buffer = 0;
+        webm_ctx->reached_eos = 1;
         return 1;
       }
       status = cluster->GetFirst(block_entry);
index 1cd35d41aa2ca7cefeff4b5458e207b8df67e7d0..7d1638035523131d667912159f2233c5f8caefb6 100644 (file)
--- a/webmdec.h
+++ b/webmdec.h
@@ -29,6 +29,7 @@ struct WebmInputContext {
   int video_track_index;
   uint64_t timestamp_ns;
   int is_key_frame;
+  int reached_eos;
 };
 
 // Checks if the input is a WebM file. If so, initializes WebMInputContext so