Index: source/libvpx/webmdec.cc |
diff --git a/source/libvpx/webmdec.cc b/source/libvpx/webmdec.cc |
index d591f3e3d7413f9b12b9f609eb31c79e958a95f8..e152f5ee03a7275cabd0d7453cf5b4a1fa26ca31 100644 |
--- a/source/libvpx/webmdec.cc |
+++ b/source/libvpx/webmdec.cc |
@@ -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); |
@@ -212,6 +219,7 @@ int webm_guess_framerate(struct WebmInputContext *webm_ctx, |
webm_ctx->block_entry = NULL; |
webm_ctx->block_frame_index = 0; |
webm_ctx->timestamp_ns = 0; |
+ webm_ctx->reached_eos = 0; |
return 0; |
} |