Commit 1f05b19e authored by Vignesh Venkatasubramanian's avatar Vignesh Venkatasubramanian
Browse files

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
parent bf7def9a
...@@ -63,6 +63,7 @@ int file_is_webm(struct WebmInputContext *webm_ctx, ...@@ -63,6 +63,7 @@ int file_is_webm(struct WebmInputContext *webm_ctx,
struct VpxInputContext *vpx_ctx) { struct VpxInputContext *vpx_ctx) {
mkvparser::MkvReader *const reader = new mkvparser::MkvReader(vpx_ctx->file); mkvparser::MkvReader *const reader = new mkvparser::MkvReader(vpx_ctx->file);
webm_ctx->reader = reader; webm_ctx->reader = reader;
webm_ctx->reached_eos = 0;
mkvparser::EBMLHeader header; mkvparser::EBMLHeader header;
long long pos = 0; long long pos = 0;
...@@ -121,6 +122,11 @@ int webm_read_frame(struct WebmInputContext *webm_ctx, ...@@ -121,6 +122,11 @@ int webm_read_frame(struct WebmInputContext *webm_ctx,
uint8_t **buffer, uint8_t **buffer,
size_t *bytes_in_buffer, size_t *bytes_in_buffer,
size_t *buffer_size) { 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 = mkvparser::Segment *const segment =
reinterpret_cast<mkvparser::Segment*>(webm_ctx->segment); reinterpret_cast<mkvparser::Segment*>(webm_ctx->segment);
const mkvparser::Cluster* cluster = const mkvparser::Cluster* cluster =
...@@ -140,6 +146,7 @@ int webm_read_frame(struct WebmInputContext *webm_ctx, ...@@ -140,6 +146,7 @@ int webm_read_frame(struct WebmInputContext *webm_ctx,
cluster = segment->GetNext(cluster); cluster = segment->GetNext(cluster);
if (cluster == NULL || cluster->EOS()) { if (cluster == NULL || cluster->EOS()) {
*bytes_in_buffer = 0; *bytes_in_buffer = 0;
webm_ctx->reached_eos = 1;
return 1; return 1;
} }
status = cluster->GetFirst(block_entry); status = cluster->GetFirst(block_entry);
......
...@@ -29,6 +29,7 @@ struct WebmInputContext { ...@@ -29,6 +29,7 @@ struct WebmInputContext {
int video_track_index; int video_track_index;
uint64_t timestamp_ns; uint64_t timestamp_ns;
int is_key_frame; int is_key_frame;
int reached_eos;
}; };
// Checks if the input is a WebM file. If so, initializes WebMInputContext so // Checks if the input is a WebM file. If so, initializes WebMInputContext so
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment