From 717894f84a803a9cab36a4144cbb27894fee6bba Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Thu, 4 Feb 2016 16:19:42 +0000 Subject: [PATCH] Add support for more than 8 bits per pixel in ffmpeg --- lib/LibAvContextHandle.cpp | 15 ++++++++++++++- lib/LibAvContextHandle.h | 2 +- lib/PlaYUVerStream.cpp | 14 +++++++------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/LibAvContextHandle.cpp b/lib/LibAvContextHandle.cpp index cc6c53a..f941cf4 100644 --- a/lib/LibAvContextHandle.cpp +++ b/lib/LibAvContextHandle.cpp @@ -112,7 +112,8 @@ Void LibAvContextHandle::closeAvFormat() m_bHasStream = false; } -Bool LibAvContextHandle::initAvFormat( const char* filename, UInt& width, UInt& height, Int& pixel_format, Double& frame_rate, UInt64& num_frames ) +Bool LibAvContextHandle::initAvFormat( const char* filename, UInt& width, UInt& height, Int& pixel_format, UInt& bits_pel, Double& frame_rate, + UInt64& num_frames ) { fmt_ctx = NULL; video_dec_ctx = NULL; @@ -211,6 +212,13 @@ Bool LibAvContextHandle::initAvFormat( const char* filename, UInt& width, UInt& num_frames = num_frames == 0 ? 1 : num_frames; Int pix_fmt = video_dec_ctx->pix_fmt; + + // Set bits per pixel to default (8 bits) + bits_pel = 8; + + /** + * Auxiliar conversation to re-use similar pixfmt + */ switch( pix_fmt ) { case AV_PIX_FMT_YUVJ420P: @@ -222,6 +230,11 @@ Bool LibAvContextHandle::initAvFormat( const char* filename, UInt& width, UInt& case AV_PIX_FMT_YUVJ444P: pix_fmt = AV_PIX_FMT_YUV444P; break; + case AV_PIX_FMT_GRAY16LE: + case AV_PIX_FMT_GRAY16BE: + bits_pel = 16; + pix_fmt = AV_PIX_FMT_GRAY8; + break; } width = video_dec_ctx->width; diff --git a/lib/LibAvContextHandle.h b/lib/LibAvContextHandle.h index 5a5506e..646c6a6 100644 --- a/lib/LibAvContextHandle.h +++ b/lib/LibAvContextHandle.h @@ -65,7 +65,7 @@ public: m_bHasStream( false ) { } - Bool initAvFormat( const char* filename, UInt& width, UInt& height, Int& pixel_format, Double& frame_rate, UInt64& num_frames ); + Bool initAvFormat( const char* filename, UInt& width, UInt& height, Int& pixel_format, UInt& bits_pel, Double& frame_rate, UInt64& num_frames ); Void closeAvFormat(); Bool decodeAvFormat(); diff --git a/lib/PlaYUVerStream.cpp b/lib/PlaYUVerStream.cpp index ece9d00..cb443fb 100644 --- a/lib/PlaYUVerStream.cpp +++ b/lib/PlaYUVerStream.cpp @@ -142,11 +142,11 @@ Void PlaYUVerStream::findHandler() { m_iStreamHandler = INVALID_HANDLER; - if( m_uiBitsPerPixel != 8 ) - { - m_iStreamHandler = YUV_IO; - return; - } +// if( m_uiBitsPerPixel != 8 ) +// { +// m_iStreamHandler = YUV_IO; +// return; +// } std::string currExt = m_cFilename.substr( m_cFilename.find_last_of( "." ) + 1 ); currExt = lowercase( currExt ); @@ -246,7 +246,7 @@ Bool PlaYUVerStream::open( std::string filename, UInt width, UInt height, Int in #ifdef USE_FFMPEG if( m_iStreamHandler == FFMPEG ) { - if( !m_cLibAvContext->initAvFormat( m_pchFilename, m_uiWidth, m_uiHeight, m_iPixelFormat, m_dFrameRate, m_uiTotalFrameNum ) ) + if( !m_cLibAvContext->initAvFormat( m_pchFilename, m_uiWidth, m_uiHeight, m_iPixelFormat, m_uiBitsPerPixel, m_dFrameRate, m_uiTotalFrameNum ) ) { throw "Cannot open file using FFmpeg libs"; } @@ -369,7 +369,7 @@ Bool PlaYUVerStream::reload() if( m_iStreamHandler == FFMPEG ) { m_cLibAvContext->closeAvFormat(); - if( !m_cLibAvContext->initAvFormat( m_pchFilename, m_uiWidth, m_uiHeight, m_iPixelFormat, m_dFrameRate, m_uiTotalFrameNum ) ) + if( !m_cLibAvContext->initAvFormat( m_pchFilename, m_uiWidth, m_uiHeight, m_iPixelFormat, m_uiBitsPerPixel, m_dFrameRate, m_uiTotalFrameNum ) ) { throw "Cannot open file using FFmpeg libs"; }