ref: 1f05b19e69a97e451380be011923cf7ed7eab4d5
parent: bf7def9a436e7ea78a600ac2e4405aa84733907d
author: Vignesh Venkatasubramanian <vigneshv@google.com>
date: Mon Mar 30 08:58:26 EDT 2015
webmdec: Fix read_frame return value for calls after EOS 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
--- a/webmdec.cc
+++ b/webmdec.cc
@@ -63,6 +63,7 @@
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 @@
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 @@
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);
--- a/webmdec.h
+++ b/webmdec.h
@@ -29,6 +29,7 @@
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