From 201707aee88fd6332761a740d26d866bf0cde761 Mon Sep 17 00:00:00 2001 From: Barrett17 Date: Sun, 5 Aug 2018 13:24:34 +0200 Subject: [PATCH] AVCodecEncoder: Skip frames * Fix garbage put into videos while encoding. * Testing welcome. * Various fixes are still waiting to be merged into Haiku. * Fixes sponsored by the V\OS project. --- .../media/plugins/ffmpeg/AVCodecEncoder.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecEncoder.cpp b/src/add-ons/media/plugins/ffmpeg/AVCodecEncoder.cpp index c55006193d..c11bf39ff2 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecEncoder.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecEncoder.cpp @@ -723,28 +723,28 @@ AVCodecEncoder::_EncodeVideo(const void* buffer, int64 frameCount, fCodecContext->time_base.num, fCodecContext->time_base.den); } - // Setup media_encode_info, most important is the time stamp. - info->start_time = (bigtime_t)(fFramesWritten * 1000000LL - / fInputFormat.u.raw_video.field_rate); + if (gotPacket == 1) { + // Setup media_encode_info, most important is the time stamp. + info->start_time = (bigtime_t)(fFramesWritten * 1000000LL + / fInputFormat.u.raw_video.field_rate); - info->flags = 0; - if (fCodecContext->coded_frame->key_frame) - info->flags |= B_MEDIA_KEY_FRAME; + info->flags = 0; + if (fCodecContext->coded_frame->key_frame) + info->flags |= B_MEDIA_KEY_FRAME; - // Write the chunk - ret = WriteChunk(pkt.data, pkt.size, info); - if (ret != B_OK) { - TRACE(" error writing chunk: %s\n", strerror(ret)); - break; + // Write the chunk + ret = WriteChunk(pkt.data, pkt.size, info); + if (ret != B_OK) { + TRACE(" error writing chunk: %s\n", strerror(ret)); + break; + } } - // Skip to the next frame (but usually, there is only one to encode // for video). frameCount--; fFramesWritten++; buffer = (const void*)((const uint8*)buffer + bufferSize); } - return ret; }