vdr-plugin-softhddevice-drm-gles 1.7.3-98a2ef7
cVideoDecoder Class Reference

Video Decoder. More...

#include <codec_video.h>

Public Member Functions

 cVideoDecoder (const char *)
 Create a new video decoder.
 
int Open (enum AVCodecID, AVCodecParameters *, AVRational, bool)
 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 buffers.
 
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.
 
void ResetPacketCounter (void)
 

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
 
std::mutex m_mutex
 mutex to lock codec context
 
int m_cntPacketsSent
 number of packets sent to decoder
 
int m_cntFramesReceived
 number of decoded frames received from decoder
 
bool m_isHardwareDecoder = false
 true, if this is a hardware decoder
 

Detailed Description

Video Decoder.

FFmpeg based Video Decoder Frontend

Handles:

  • Video packet decoding using FFmpeg

Definition at line 37 of file codec_video.h.

Constructor & Destructor Documentation

◆ cVideoDecoder()

cVideoDecoder::cVideoDecoder ( const char *  identifier)

Create a new video decoder.

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

Definition at line 146 of file codec_video.cpp.

References cSoftHdLogger::LogFFmpegCallback().

Member Function Documentation

◆ Close()

void cVideoDecoder::Close ( void  )

Close video decoder.

Definition at line 299 of file codec_video.cpp.

References L_CODEC, LOGDEBUG2, m_identifier, m_mutex, m_pVideoCtx, and ResetPacketCounter().

Referenced by cVideoStream::CloseDecoder(), cVideoStream::Exit(), and ReopenCodec().

◆ FlushBuffers()

void cVideoDecoder::FlushBuffers ( void  )

Flush the video decoder buffers.

Also reset packet sent/ frame received counter

Definition at line 542 of file codec_video.cpp.

References L_CODEC, LOGDEBUG2, m_identifier, m_mutex, m_pVideoCtx, and ResetPacketCounter().

Referenced by cVideoStream::FlushDecoder().

◆ GetContext()

AVCodecContext * cVideoDecoder::GetContext ( void  )
inline

Definition at line 46 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
Return values
0extradata set
-1something went wrong

Definition at line 319 of file codec_video.cpp.

References LOGERROR, m_identifier, and m_pVideoCtx.

Referenced by SendPacket().

◆ GetFramesReceived()

int cVideoDecoder::GetFramesReceived ( void  )
inline

Definition at line 50 of file codec_video.h.

References m_cntFramesReceived.

Referenced by cVideoStream::DecodeInput().

◆ GetPacketsSent()

int cVideoDecoder::GetPacketsSent ( void  )
inline

Definition at line 49 of file codec_video.h.

References m_cntPacketsSent.

Referenced by cVideoStream::DecodeInput().

◆ IsHardwareDecoder()

bool cVideoDecoder::IsHardwareDecoder ( void  )
inline

◆ Name()

const char * cVideoDecoder::Name ( void  )
inline

Definition at line 48 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 
)

Open the video decoder.

Parameters
codecIdvideo codec id
parcodec parameters
timebasetimebase
forceSoftwareDecoderforce software decoding
Return values
0decoder successfully opend
-1opening the decoder failed

Definition at line 167 of file codec_video.cpp.

References av_err2str, FindHWConfig(), FindHWDecoder(), FindSWDecoder(), GetFormat(), L_AV_SYNC, L_CODEC, LOGDEBUG, LOGDEBUG2, LOGERROR, LOGGER, m_identifier, m_isHardwareDecoder, m_mutex, m_pCodecString, m_pVideoCtx, Open(), and ResetPacketCounter().

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
Return values
0received frame
AVERROR(EAGAIN)get no frame, send avpkt again
AVERROR_EOFEOF, needs flushing
AVERROR(EINVAL)get no frame, something went wrong
retreturn other ffmpeg error

Definition at line 463 of file codec_video.cpp.

References av_err2str, isInterlacedFrame(), L_AV_SYNC, L_CODEC, L_PACKET, LOGDEBUG2, LOGFATAL, LOGGER, m_cntFramesReceived, m_cntPacketsSent, m_identifier, m_mutex, m_pVideoCtx, and Timestamp2StringPts().

Referenced by cVideoStream::ReceiveFrame().

◆ 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
Return values
0success
-1reopen 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 526 of file codec_video.cpp.

References Close(), L_CODEC, LOGDEBUG2, m_identifier, m_pVideoCtx, and Open().

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

◆ ResetPacketCounter()

void cVideoDecoder::ResetPacketCounter ( void  )
inlineprivate

Definition at line 62 of file codec_video.h.

References m_cntFramesReceived, and m_cntPacketsSent.

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

◆ SendPacket()

int cVideoDecoder::SendPacket ( const AVPacket *  avpkt)

Send a video packet to be decoded.

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

Definition at line 405 of file codec_video.cpp.

References av_err2str, GetExtraData(), L_AV_SYNC, L_CODEC, L_PACKET, LOGDEBUG2, LOGGER, m_cntPacketsSent, m_identifier, m_mutex, m_pVideoCtx, and Timestamp2StringPts().

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

Member Data Documentation

◆ m_cntFramesReceived

int cVideoDecoder::m_cntFramesReceived
private

number of decoded frames received from decoder

Definition at line 58 of file codec_video.h.

Referenced by GetFramesReceived(), ReceiveFrame(), and ResetPacketCounter().

◆ m_cntPacketsSent

int cVideoDecoder::m_cntPacketsSent
private

number of packets sent to decoder

Definition at line 57 of file codec_video.h.

Referenced by GetPacketsSent(), ReceiveFrame(), ResetPacketCounter(), and SendPacket().

◆ m_identifier

const char* cVideoDecoder::m_identifier
private

identifier for logging

Definition at line 54 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 59 of file codec_video.h.

Referenced by IsHardwareDecoder(), and Open().

◆ m_mutex

std::mutex cVideoDecoder::m_mutex
private

mutex to lock codec context

Definition at line 56 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 55 of file codec_video.h.

Referenced by Name(), and Open().

◆ m_pVideoCtx

AVCodecContext* cVideoDecoder::m_pVideoCtx = nullptr
private

video codec context

Definition at line 53 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: