vdr-plugin-softhddevice-drm-gles 1.5.9-20e15de
cVideoDecoder Class Reference

cVideoDecoder - VideoDecoder class More...

#include <codec_video.h>

Public Member Functions

 cVideoDecoder (int, const char *)
 cVideoDecoder constructor
 
int Open (enum AVCodecID, AVCodecParameters *, AVRational, bool, int, int)
 Open the video decoder.
 
void Close (void)
 Close video decoder.
 
int SendPacket (const AVPacket *)
 Send a video packet to be decoded.
 
int ReceiveFrame (AVFrame **)
 Receive a decoded a video frame.
 
void FlushBuffers (void)
 Flush the video decoder.
 
int ReopenCodec (enum AVCodecID, AVCodecParameters *, AVRational, int)
 Reopen the video decoder.
 
AVCodecContext * GetContext (void)
 
bool IsHardwareDecoder (void)
 
const char * Name (void)
 
int GetPacketsSent (void)
 
int GetFramesReceived (void)
 

Private Member Functions

int GetExtraData (const AVPacket *)
 Get extradata from avpkt.
 
bool IsKeyFrame (AVFrame *)
 Check, if this is a key frame.
 

Private Attributes

AVCodecContext * m_pVideoCtx = nullptr
 video codec context
 
const char * m_identifier
 identifier for logging
 
const char * m_pCodecString = "unknown"
 codec (long) name string
 
cMutex m_mutex
 mutex to lock codec context (TODO: is this needed?)
 
int m_cntPacketsSent
 number of packets sent to decoder
 
int m_cntFramesReceived
 number of decoded frames received from decoder
 
int m_cntStartKeyFrames
 number of keyframes arrived while starting the coded (needed for amlogic h264 decoder in order to drop some frames in ReceiveFrame() before sending them to the renderer)
 
int m_lastCodedWidth
 save coded width while closing for a directly reopen
 
int m_lastCodedHeight
 save coded height while closing for a directly reopen
 
int m_hardwareQuirks
 hardware specific quirks needed for decoder
 
bool m_isHardwareDecoder = false
 true, if this is a hardware decoder
 

Detailed Description

cVideoDecoder - VideoDecoder class

Definition at line 33 of file codec_video.h.

Constructor & Destructor Documentation

◆ cVideoDecoder()

cVideoDecoder::cVideoDecoder ( int  hardwareQuirks,
const char *  identifier 
)

cVideoDecoder constructor

Parameters
hardwareQuirkshardware specific quirks for decoder
identifierstring to identify decoder for video or pip stream (used within logging only)

Definition at line 150 of file codec_video.cpp.

References cSoftHdLogger::LogFFmpegCallback().

Member Function Documentation

◆ Close()

void cVideoDecoder::Close ( void  )

◆ FlushBuffers()

void cVideoDecoder::FlushBuffers ( void  )

Flush the video decoder.

Definition at line 575 of file codec_video.cpp.

References L_CODEC, LOGDEBUG2, m_cntFramesReceived, m_cntPacketsSent, m_identifier, m_mutex, and m_pVideoCtx.

Referenced by cVideoStream::FlushDecoder().

◆ GetContext()

AVCodecContext * cVideoDecoder::GetContext ( void  )
inline

Definition at line 42 of file codec_video.h.

References m_pVideoCtx.

Referenced by cVideoStream::GetVideoSize(), and cVideoStream::RenderFrame().

◆ GetExtraData()

int cVideoDecoder::GetExtraData ( const AVPacket *  avpkt)
private

Get extradata from avpkt.

Parameters
avpktvideo packet
Returns
0 extradata set
-1 something went wrong

Definition at line 341 of file codec_video.cpp.

References LOGERROR, m_identifier, and m_pVideoCtx.

Referenced by SendPacket().

◆ GetFramesReceived()

int cVideoDecoder::GetFramesReceived ( void  )
inline

Definition at line 46 of file codec_video.h.

References m_cntFramesReceived.

Referenced by cVideoStream::DecodeInput().

◆ GetPacketsSent()

int cVideoDecoder::GetPacketsSent ( void  )
inline

Definition at line 45 of file codec_video.h.

References m_cntPacketsSent.

Referenced by cVideoStream::DecodeInput().

◆ IsHardwareDecoder()

bool cVideoDecoder::IsHardwareDecoder ( void  )
inline

◆ IsKeyFrame()

bool cVideoDecoder::IsKeyFrame ( AVFrame *  frame)
private

Check, if this is a key frame.

Parameters
frameAVFrame
Returns
true, if this frame is a key frame

Definition at line 592 of file codec_video.cpp.

Referenced by ReceiveFrame().

◆ Name()

const char * cVideoDecoder::Name ( void  )
inline

Definition at line 44 of file codec_video.h.

References m_pCodecString.

Referenced by cVideoStream::OpenDecoder().

◆ Open()

int cVideoDecoder::Open ( enum AVCodecID  codecId,
AVCodecParameters *  par,
AVRational  timebase,
bool  forceSoftwareDecoder,
int  width,
int  height 
)

Open the video decoder.

Parameters
codecIdvideo codec id
parcodec parameters
timebasetimebase
forceSoftwareDecoderforce software decoding
widthforce width (only for H264 and if par is not set)
heightforce height (only for H264 and if par is not set)
Returns
0 decoder successfully opend
-1 opening the decoder failed

Definition at line 174 of file codec_video.cpp.

References FindHWConfig(), FindHWDecoder(), FindSWDecoder(), GetFormat(), L_CODEC, LOGDEBUG2, LOGERROR, LOGINFO, m_cntFramesReceived, m_cntPacketsSent, m_cntStartKeyFrames, m_hardwareQuirks, m_identifier, m_isHardwareDecoder, m_mutex, m_pCodecString, m_pVideoCtx, Open(), QUIRK_CODEC_DISABLE_H264_HW, and QUIRK_CODEC_DISABLE_MPEG_HW.

Referenced by Open(), cVideoStream::OpenDecoder(), and ReopenCodec().

◆ ReceiveFrame()

int cVideoDecoder::ReceiveFrame ( AVFrame **  frame)

Receive a decoded a video frame.

Parameters
[out]framedecoded AVFrame
instanceinstance name for logging
Returns
0 received frame
AVERROR(EAGAIN) get no frame, send avpkt again
AVERROR_EOF EOF, needs flushing
AVERROR(EINVAL) get no frame, something went wrong
ret return other ffmpeg error

Definition at line 482 of file codec_video.cpp.

References isInterlacedFrame(), IsKeyFrame(), L_CODEC, L_PACKET, LOGDEBUG2, LOGFATAL, m_cntFramesReceived, m_cntPacketsSent, m_cntStartKeyFrames, m_hardwareQuirks, m_identifier, m_mutex, m_pVideoCtx, QUIRK_CODEC_SKIP_FIRST_FRAMES, QUIRK_CODEC_SKIP_NUM_FRAMES, and Timestamp2String().

Referenced by cVideoStream::DecodeInput().

◆ ReopenCodec()

int cVideoDecoder::ReopenCodec ( enum AVCodecID  codecId,
AVCodecParameters *  par,
AVRational  timebase,
int  forceSoftwareDecoding 
)

Reopen the video decoder.

Parameters
codecIdvideo codec id
parcodec parameters
timebasetimebase
forceSoftwareDecodingforce software decoding
Returns
0 success
-1 reopen decoder failed
Todo:
: This is just a temporary implementation RPi's ffmpeg decoder is broken. In order to get the same result if we want to flush the decoder, we need to close and reopen it. This function is only needed, if some decoder can't flush correctly. Once this is fixed in ffmpeg, we can drop this function. remove, once ffmpeg is fixed

Definition at line 559 of file codec_video.cpp.

References Close(), L_CODEC, LOGDEBUG2, m_cntFramesReceived, m_cntPacketsSent, m_cntStartKeyFrames, m_identifier, m_lastCodedHeight, m_lastCodedWidth, m_pVideoCtx, and Open().

Referenced by cVideoStream::DecodeInput(), and cVideoStream::FlushDecoder().

◆ SendPacket()

int cVideoDecoder::SendPacket ( const AVPacket *  avpkt)

Send a video packet to be decoded.

Parameters
avpktvideo packet
Returns
0 packet was sent
AVERROR(EAGAIN) packet was not accepted, first receive frame and send packet again
AVERROR(EINVAL) invalid input or missing m_pVideoCtx
ret other ffmpeg error

Definition at line 427 of file codec_video.cpp.

References GetExtraData(), L_CODEC, L_PACKET, LOGDEBUG2, m_cntPacketsSent, m_identifier, m_mutex, m_pVideoCtx, and Timestamp2String().

Referenced by cVideoStream::CheckForcingFrameDecode(), and cVideoStream::DecodeInput().

Member Data Documentation

◆ m_cntFramesReceived

int cVideoDecoder::m_cntFramesReceived
private

number of decoded frames received from decoder

Definition at line 54 of file codec_video.h.

Referenced by Close(), FlushBuffers(), GetFramesReceived(), Open(), ReceiveFrame(), and ReopenCodec().

◆ m_cntPacketsSent

int cVideoDecoder::m_cntPacketsSent
private

number of packets sent to decoder

Definition at line 53 of file codec_video.h.

Referenced by Close(), FlushBuffers(), GetPacketsSent(), Open(), ReceiveFrame(), ReopenCodec(), and SendPacket().

◆ m_cntStartKeyFrames

int cVideoDecoder::m_cntStartKeyFrames
private

number of keyframes arrived while starting the coded (needed for amlogic h264 decoder in order to drop some frames in ReceiveFrame() before sending them to the renderer)

Definition at line 55 of file codec_video.h.

Referenced by Open(), ReceiveFrame(), and ReopenCodec().

◆ m_hardwareQuirks

int cVideoDecoder::m_hardwareQuirks
private

hardware specific quirks needed for decoder

Definition at line 60 of file codec_video.h.

Referenced by Open(), and ReceiveFrame().

◆ m_identifier

const char* cVideoDecoder::m_identifier
private

identifier for logging

Definition at line 50 of file codec_video.h.

Referenced by Close(), FlushBuffers(), GetExtraData(), Open(), ReceiveFrame(), ReopenCodec(), and SendPacket().

◆ m_isHardwareDecoder

bool cVideoDecoder::m_isHardwareDecoder = false
private

true, if this is a hardware decoder

Definition at line 61 of file codec_video.h.

Referenced by IsHardwareDecoder(), and Open().

◆ m_lastCodedHeight

int cVideoDecoder::m_lastCodedHeight
private

save coded height while closing for a directly reopen

Definition at line 59 of file codec_video.h.

Referenced by Close(), and ReopenCodec().

◆ m_lastCodedWidth

int cVideoDecoder::m_lastCodedWidth
private

save coded width while closing for a directly reopen

Definition at line 58 of file codec_video.h.

Referenced by Close(), and ReopenCodec().

◆ m_mutex

cMutex cVideoDecoder::m_mutex
private

mutex to lock codec context (TODO: is this needed?)

Definition at line 52 of file codec_video.h.

Referenced by Close(), FlushBuffers(), Open(), ReceiveFrame(), and SendPacket().

◆ m_pCodecString

const char* cVideoDecoder::m_pCodecString = "unknown"
private

codec (long) name string

Definition at line 51 of file codec_video.h.

Referenced by Name(), and Open().

◆ m_pVideoCtx

AVCodecContext* cVideoDecoder::m_pVideoCtx = nullptr
private

video codec context

Definition at line 49 of file codec_video.h.

Referenced by Close(), FlushBuffers(), GetContext(), GetExtraData(), Open(), ReceiveFrame(), ReopenCodec(), and SendPacket().


The documentation for this class was generated from the following files: