From 7854c0ad7381382e969d3ee92b3395a070e06e06 Mon Sep 17 00:00:00 2001 From: Alf Date: Tue, 22 Dec 2020 22:33:39 -0800 Subject: [PATCH] Use gop size for perPage results. #3 --- src/ffprobe-wasm-wrapper.cpp | 18 +++++++++++++++--- www/src/components/File.vue | 14 ++++++-------- www/src/components/Frames.vue | 8 +++++++- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/ffprobe-wasm-wrapper.cpp b/src/ffprobe-wasm-wrapper.cpp index c27fea1..af7672f 100644 --- a/src/ffprobe-wasm-wrapper.cpp +++ b/src/ffprobe-wasm-wrapper.cpp @@ -64,6 +64,7 @@ typedef struct FileInfoResponse { typedef struct FramesResponse { std::vector frames; int nb_frames; + int gop_size; } FramesResponse; FileInfoResponse get_file_info(std::string filename) { @@ -200,8 +201,10 @@ FramesResponse get_frames(std::string filename, int offset) { AVPacket *pPacket = av_packet_alloc(); AVFrame *pFrame = av_frame_alloc(); - int how_many_packets_to_process = 48; // per page. - int frame_count = 1; + int max_packets_to_process = 1000; + int frame_count = 0; + int key_frames = 0; + int gop_size = 0; // Read video frames. while (av_read_frame(pFormatContext, pPacket) >= 0) { @@ -217,6 +220,12 @@ FramesResponse get_frames(std::string filename, int offset) { continue; } + // Track keyframes so we paginate by each GOP. + if (pFrame->key_frame == 1) key_frames++; + + // Break at the next keyframe found. + if (key_frames > 1) break; + Frame f = { .frame_number = frame_count, .pict_type = (char) av_get_picture_type_char(pFrame->pict_type), @@ -226,7 +235,7 @@ FramesResponse get_frames(std::string filename, int offset) { }; r.frames.push_back(f); - if (--how_many_packets_to_process <= 0) break; + if (--max_packets_to_process <= 0) break; } } frame_count++; @@ -237,6 +246,8 @@ FramesResponse get_frames(std::string filename, int offset) { av_packet_free(&pPacket); av_frame_free(&pFrame); avcodec_free_context(&pCodecContext); + + r.gop_size = frame_count - offset; return r; } @@ -287,6 +298,7 @@ EMSCRIPTEN_BINDINGS(structs) { emscripten::value_object("FramesResponse") .field("frames", &FramesResponse::frames) .field("nb_frames", &FramesResponse::nb_frames) + .field("gop_size", &FramesResponse::gop_size) ; function("get_frames", &get_frames); } \ No newline at end of file diff --git a/www/src/components/File.vue b/www/src/components/File.vue index a039411..c6fbbd7 100644 --- a/www/src/components/File.vue +++ b/www/src/components/File.vue @@ -15,7 +15,7 @@
Selected file: {{ file ? `${file.name}: ${file.size} bytes` : '' }}
- +
@@ -42,18 +42,16 @@ export default { data() { return { file: null, - data: null, info: null, - } - }, - created() { - this.$worker.onmessage = (e) => { - this.info = e.data; + tabIndex: 0, } }, methods: { onFile(event) { - this.data = null; + this.tabIndex = 0; + this.$worker.onmessage = (e) => { + this.info = e.data; + } const file = event.dataTransfer ? event.dataTransfer.files[0] : event.target.files[0]; this.$worker.postMessage([ 'get_file_info', file ]); } diff --git a/www/src/components/Frames.vue b/www/src/components/Frames.vue index 7380f9a..e6f2104 100644 --- a/www/src/components/Frames.vue +++ b/www/src/components/Frames.vue @@ -3,6 +3,7 @@

Frames

Loading...
+

GOP Size: {{ data.gop_size }}

Total: {{ data.nb_frames }}

+ @@ -43,11 +47,13 @@ export default { return { data: null, currentPage: 1, - perPage: 48, isBusy: false, }; }, computed: { + perPage() { + return this.data.gop_size; + }, pages() { return this.data.nb_frames; },