diff options
-rw-r--r-- | test/webm_video_source.h | 12 | ||||
-rw-r--r-- | webmdec.cc | 2 | ||||
-rw-r--r-- | webmdec.h | 1 |
3 files changed, 15 insertions, 0 deletions
diff --git a/test/webm_video_source.h b/test/webm_video_source.h index 11d3d234d..650bc52dc 100644 --- a/test/webm_video_source.h +++ b/test/webm_video_source.h @@ -69,6 +69,18 @@ class WebMVideoSource : public CompressedVideoSource { } } + void SeekToNextKeyFrame() { + ASSERT_TRUE(vpx_ctx_->file != NULL); + do { + const int status = webm_read_frame(webm_ctx_, &buf_, &buf_sz_, &buf_sz_); + ASSERT_GE(status, 0) << "webm_read_frame failed"; + ++frame_; + if (status == 1) { + end_of_file_ = true; + } + } while (!webm_ctx_->is_key_frame && !end_of_file_); + } + virtual const uint8_t *cxdata() const { return end_of_file_ ? NULL : buf_; } diff --git a/webmdec.cc b/webmdec.cc index 4383e8efd..d591f3e3d 100644 --- a/webmdec.cc +++ b/webmdec.cc @@ -41,6 +41,7 @@ void reset(struct WebmInputContext *const webm_ctx) { webm_ctx->block_frame_index = 0; webm_ctx->video_track_index = 0; webm_ctx->timestamp_ns = 0; + webm_ctx->is_key_frame = false; } void get_first_cluster(struct WebmInputContext *const webm_ctx) { @@ -182,6 +183,7 @@ int webm_read_frame(struct WebmInputContext *webm_ctx, } *bytes_in_buffer = frame.len; webm_ctx->timestamp_ns = block->GetTime(cluster); + webm_ctx->is_key_frame = block->IsKey(); mkvparser::MkvReader *const reader = reinterpret_cast<mkvparser::MkvReader*>(webm_ctx->reader); @@ -28,6 +28,7 @@ struct WebmInputContext { int block_frame_index; int video_track_index; uint64_t timestamp_ns; + int is_key_frame; }; // Checks if the input is a WebM file. If so, initializes WebMInputContext so |