summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/webm_video_source.h12
-rw-r--r--webmdec.cc2
-rw-r--r--webmdec.h1
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);
diff --git a/webmdec.h b/webmdec.h
index 29b815da1..1cd35d41a 100644
--- a/webmdec.h
+++ b/webmdec.h
@@ -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