X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fdecoder.cpp;h=20911145ba249b92206ef68e472170d19bfd4bb8;hp=a89f72bbb69b021f890edabaf0ab1a03b3820bf6;hb=7963a66b2debe9cf6ae566cb88511fdfdc9dc216;hpb=ac2878879847f965225e0f72c22ad17b513c16e6 diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index a89f72b..2091114 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -34,12 +34,21 @@ #include #include +#include + /* these are quite new... */ #ifndef AUDIO_GET_PTS #define AUDIO_GET_PTS _IOR('o', 19, __u64) #define VIDEO_GET_PTS _IOR('o', 57, __u64) #endif +#ifndef VIDEO_SOURCE_HDMI +#define VIDEO_SOURCE_HDMI 2 +#endif +#ifndef AUDIO_SOURCE_HDMI +#define AUDIO_SOURCE_HDMI 2 +#endif + DEFINE_REF(eDVBAudio); eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev) @@ -49,19 +58,31 @@ eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev) #if HAVE_DVB_API_VERSION < 3 sprintf(filename, "/dev/dvb/card%d/audio%d", demux->adapter, dev); #else - sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev); + sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux ? demux->adapter : 0, dev); #endif m_fd = ::open(filename, O_RDWR); if (m_fd < 0) eWarning("%s: %m", filename); + if (demux) + { #if HAVE_DVB_API_VERSION < 3 - sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); + sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); #else - sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); + sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); #endif - m_fd_demux = ::open(filename, O_RDWR); - if (m_fd_demux < 0) - eWarning("%s: %m", filename); + m_fd_demux = ::open(filename, O_RDWR); + if (m_fd_demux < 0) + eWarning("%s: %m", filename); + } + else + { + m_fd_demux = -1; + } + + if (m_fd >= 0) + { + ::ioctl(m_fd, AUDIO_SELECT_SOURCE, demux ? AUDIO_SOURCE_DEMUX : AUDIO_SOURCE_HDMI); + } } #if HAVE_DVB_API_VERSION < 3 @@ -158,85 +179,115 @@ int eDVBAudio::setAVSync(int val) #else int eDVBAudio::startPid(int pid, int type) { - if ((m_fd < 0) || (m_fd_demux < 0)) - return -1; - dmx_pes_filter_params pes; - - pes.pid = pid; - pes.input = DMX_IN_FRONTEND; - pes.output = DMX_OUT_DECODER; - pes.pes_type = m_dev ? DMX_PES_AUDIO1 : DMX_PES_AUDIO0; /* FIXME */ - pes.flags = 0; - eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - audio - ", pid); - if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) - { - eDebug("failed (%m)"); - return -errno; - } - eDebug("ok"); - eDebugNoNewLine("DEMUX_START - audio - "); - if (::ioctl(m_fd_demux, DMX_START) < 0) + if (m_fd_demux >= 0) { - eDebug("failed (%m)"); - return -errno; + dmx_pes_filter_params pes; + + pes.pid = pid; + pes.input = DMX_IN_FRONTEND; + pes.output = DMX_OUT_DECODER; + switch (m_dev) + { + case 0: + pes.pes_type = DMX_PES_AUDIO0; + break; + case 1: + pes.pes_type = DMX_PES_AUDIO1; + break; + case 2: + pes.pes_type = DMX_PES_AUDIO2; + break; + case 3: + pes.pes_type = DMX_PES_AUDIO3; + break; + } + pes.flags = 0; + eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - audio - ", pid); + if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) + { + eDebug("failed (%m)"); + return -errno; + } + eDebug("ok"); + eDebugNoNewLine("DEMUX_START - audio - "); + if (::ioctl(m_fd_demux, DMX_START) < 0) + { + eDebug("failed (%m)"); + return -errno; + } + eDebug("ok"); } - eDebug("ok"); - int bypass = 0; - switch (type) + if (m_fd >= 0) { - case aMPEG: - bypass = 1; - break; - case aAC3: - bypass = 0; - break; - case aDTS: - bypass = 2; - break; - case aAAC: - bypass = 8; - break; - case aAACHE: - bypass = 9; - break; - case aLPCM: - bypass = 6; - break; - case aDTSHD: - bypass = 0x10; - break; - } + int bypass = 0; - eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass); - if (::ioctl(m_fd, AUDIO_SET_BYPASS_MODE, bypass) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); - freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState - eDebugNoNewLine("AUDIO_PLAY - "); - if (::ioctl(m_fd, AUDIO_PLAY) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); + switch (type) + { + case aMPEG: + bypass = 1; + break; + case aAC3: + bypass = 0; + break; + case aDTS: + bypass = 2; + break; + case aAAC: + bypass = 8; + break; + case aAACHE: + bypass = 9; + break; + case aLPCM: + bypass = 6; + break; + case aDTSHD: + bypass = 0x10; + break; + case aDDP: + bypass = 0x22; + break; + + } + + eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass); + if (::ioctl(m_fd, AUDIO_SET_BYPASS_MODE, bypass) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); + freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState + eDebugNoNewLine("AUDIO_PLAY - "); + if (::ioctl(m_fd, AUDIO_PLAY) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); + } return 0; } #endif void eDVBAudio::stop() { - eDebugNoNewLine("AUDIO_STOP - "); - if (::ioctl(m_fd, AUDIO_STOP) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); + if (m_fd >= 0) + { + eDebugNoNewLine("AUDIO_STOP - "); + if (::ioctl(m_fd, AUDIO_STOP) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); + } + + if (m_fd_demux >= 0) + { #if HAVE_DVB_API_VERSION > 2 - eDebugNoNewLine("DEMUX_STOP - audio - "); - if (::ioctl(m_fd_demux, DMX_STOP) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); + eDebugNoNewLine("DEMUX_STOP - audio - "); + if (::ioctl(m_fd_demux, DMX_STOP) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); #endif + } } void eDVBAudio::flush() @@ -300,8 +351,8 @@ eDVBAudio::~eDVBAudio() DEFINE_REF(eDVBVideo); -eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev) - : m_demux(demux), m_dev(dev), +eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev, bool fcc_enable) + : m_demux(demux), m_dev(dev), m_fcc_enable(fcc_enable), m_width(-1), m_height(-1), m_framerate(-1), m_aspect(-1), m_progressive(-1) { char filename[128]; @@ -311,7 +362,7 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev) if (m_fd_video < 0) eWarning("/dev/video: %m"); #else - sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev); + sprintf(filename, "/dev/dvb/adapter%d/video%d", demux ? demux->adapter : 0, dev); #endif m_fd = ::open(filename, O_RDWR); if (m_fd < 0) @@ -322,15 +373,30 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev) CONNECT(m_sn->activated, eDVBVideo::video_event); } eDebug("Video Device: %s", filename); + + + + if (demux) + { #if HAVE_DVB_API_VERSION < 3 - sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); + sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); #else - sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); + sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); #endif - m_fd_demux = ::open(filename, O_RDWR); - if (m_fd_demux < 0) - eWarning("%s: %m", filename); - eDebug("demux device: %s", filename); + m_fd_demux = ::open(filename, O_RDWR); + if (m_fd_demux < 0) + eWarning("%s: %m", filename); + eDebug("demux device: %s", filename); + } + else + { + m_fd_demux = -1; + } + + if (m_fd >= 0) + { + ::ioctl(m_fd, VIDEO_SELECT_SOURCE, demux ? VIDEO_SOURCE_DEMUX : VIDEO_SOURCE_HDMI); + } } // not finally values i think.. !! @@ -340,6 +406,7 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev) #define VIDEO_STREAMTYPE_MPEG4_Part2 4 #define VIDEO_STREAMTYPE_VC1_SM 5 #define VIDEO_STREAMTYPE_MPEG1 6 +#define VIDEO_STREAMTYPE_H265_HEVC 7 #if HAVE_DVB_API_VERSION < 3 int eDVBVideo::setPid(int pid) @@ -401,83 +468,121 @@ int eDVBVideo::stopPid() #else int eDVBVideo::startPid(int pid, int type) { - int streamtype = VIDEO_STREAMTYPE_MPEG2; - - if ((m_fd < 0) || (m_fd_demux < 0)) - return -1; - dmx_pes_filter_params pes; + if (m_fcc_enable) + return 0; - switch(type) + if (m_fd >= 0) { - default: - case MPEG2: - break; - case MPEG4_H264: - streamtype = VIDEO_STREAMTYPE_MPEG4_H264; - break; - case MPEG1: - streamtype = VIDEO_STREAMTYPE_MPEG1; - break; - case MPEG4_Part2: - streamtype = VIDEO_STREAMTYPE_MPEG4_Part2; - break; - case VC1: - streamtype = VIDEO_STREAMTYPE_VC1; - break; - case VC1_SM: - streamtype = VIDEO_STREAMTYPE_VC1_SM; - break; - } + int streamtype = VIDEO_STREAMTYPE_MPEG2; + switch(type) + { + default: + case MPEG2: + break; + case MPEG4_H264: + streamtype = VIDEO_STREAMTYPE_MPEG4_H264; + break; + case MPEG1: + streamtype = VIDEO_STREAMTYPE_MPEG1; + break; + case MPEG4_Part2: + streamtype = VIDEO_STREAMTYPE_MPEG4_Part2; + break; + case VC1: + streamtype = VIDEO_STREAMTYPE_VC1; + break; + case VC1_SM: + streamtype = VIDEO_STREAMTYPE_VC1_SM; + break; + case H265_HEVC: + streamtype = VIDEO_STREAMTYPE_H265_HEVC; + break; + } - eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ", streamtype); - if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE, streamtype) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); + eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ", streamtype); + if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE, streamtype) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); + + } - pes.pid = pid; - pes.input = DMX_IN_FRONTEND; - pes.output = DMX_OUT_DECODER; - pes.pes_type = m_dev ? DMX_PES_VIDEO1 : DMX_PES_VIDEO0; /* FIXME */ - pes.flags = 0; - eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - video - ", pid); - if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) + if (m_fd_demux >= 0) { - eDebug("failed (%m)"); - return -errno; + dmx_pes_filter_params pes; + + pes.pid = pid; + pes.input = DMX_IN_FRONTEND; + pes.output = DMX_OUT_DECODER; + switch (m_dev) + { + case 0: + pes.pes_type = DMX_PES_VIDEO0; + break; + case 1: + pes.pes_type = DMX_PES_VIDEO1; + break; + case 2: + pes.pes_type = DMX_PES_VIDEO2; + break; + case 3: + pes.pes_type = DMX_PES_VIDEO3; + break; + } + pes.flags = 0; + eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - video - ", pid); + if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) + { + eDebug("failed (%m)"); + return -errno; + } + eDebug("ok"); + eDebugNoNewLine("DEMUX_START - video - "); + if (::ioctl(m_fd_demux, DMX_START) < 0) + { + eDebug("failed (%m)"); + return -errno; + } + eDebug("ok"); } - eDebug("ok"); - eDebugNoNewLine("DEMUX_START - video - "); - if (::ioctl(m_fd_demux, DMX_START) < 0) + + if (m_fd >= 0) { - eDebug("failed (%m)"); - return -errno; + freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState + eDebugNoNewLine("VIDEO_PLAY - "); + if (::ioctl(m_fd, VIDEO_PLAY) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); } - eDebug("ok"); - freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState - eDebugNoNewLine("VIDEO_PLAY - "); - if (::ioctl(m_fd, VIDEO_PLAY) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); return 0; } #endif void eDVBVideo::stop() { + if (m_fcc_enable) + return; + + if (m_fd_demux >= 0) + { #if HAVE_DVB_API_VERSION > 2 - eDebugNoNewLine("DEMUX_STOP - video - "); - if (::ioctl(m_fd_demux, DMX_STOP) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); + eDebugNoNewLine("DEMUX_STOP - video - "); + if (::ioctl(m_fd_demux, DMX_STOP) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); #endif - eDebugNoNewLine("VIDEO_STOP - "); - if (::ioctl(m_fd, VIDEO_STOP, 1) < 0) - eDebug("failed (%m)"); - else - eDebug("ok"); + } + + if (m_fd >= 0) + { + eDebugNoNewLine("VIDEO_STOP - "); + if (::ioctl(m_fd, VIDEO_STOP, 1) < 0) + eDebug("failed (%m)"); + else + eDebug("ok"); + } } void eDVBVideo::flush() @@ -752,7 +857,21 @@ int eDVBPCR::startPid(int pid) pes.pid = pid; pes.input = DMX_IN_FRONTEND; pes.output = DMX_OUT_DECODER; - pes.pes_type = m_dev ? DMX_PES_PCR1 : DMX_PES_PCR0; /* FIXME */ + switch (m_dev) + { + case 0: + pes.pes_type = DMX_PES_PCR0; + break; + case 1: + pes.pes_type = DMX_PES_PCR1; + break; + case 2: + pes.pes_type = DMX_PES_PCR2; + break; + case 3: + pes.pes_type = DMX_PES_PCR3; + break; + } pes.flags = 0; eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid); if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) @@ -988,7 +1107,7 @@ int eTSMPEGDecoder::setState() { if ((m_vpid >= 0) && (m_vpid < 0x1FFF)) { - m_video = new eDVBVideo(m_demux, m_decoder); + m_video = new eDVBVideo(m_demux, m_decoder, m_fcc_enable); m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn); if (m_video->startPid(m_vpid, m_vtype)) res = -1; @@ -1094,9 +1213,13 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay) eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder) : m_demux(demux), m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1), - m_changed(0), m_decoder(decoder), m_video_clip_fd(-1), m_showSinglePicTimer(eTimer::create(eApp)) + m_changed(0), m_decoder(decoder), m_video_clip_fd(-1), m_showSinglePicTimer(eTimer::create(eApp)), + m_fcc_fd(-1), m_fcc_enable(false), m_fcc_state(fcc_state_stop), m_fcc_feid(-1), m_fcc_vpid(-1), m_fcc_vtype(-1), m_fcc_pcrpid(-1) { - demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event_conn); + if (m_demux) + { + demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event_conn); + } CONNECT(m_showSinglePicTimer->timeout, eTSMPEGDecoder::finishShowSinglePic); m_state = stateStop; } @@ -1107,6 +1230,8 @@ eTSMPEGDecoder::~eTSMPEGDecoder() m_vpid = m_apid = m_pcrpid = m_textpid = pidNone; m_changed = -1; setState(); + fccStop(); + fccFreeFD(); } RESULT eTSMPEGDecoder::setVideoPID(int vpid, int type) @@ -1413,3 +1538,242 @@ int eTSMPEGDecoder::getVideoAspect() return m_video->getAspect(); return -1; } + +#define FCC_SET_VPID 100 +#define FCC_SET_APID 101 +#define FCC_SET_PCRPID 102 +#define FCC_SET_VCODEC 103 +#define FCC_SET_ACODEC 104 +#define FCC_SET_FRONTEND_ID 105 +#define FCC_START 106 +#define FCC_STOP 107 +#define FCC_DECODER_START 108 +#define FCC_DECODER_STOP 109 + +RESULT eTSMPEGDecoder::prepareFCC(int fe_id, int vpid, int vtype, int pcrpid) +{ + //eDebug("[eTSMPEGDecoder::prepareFCC] vp : %d, vt : %d, pp : %d, fe : %d", vpid, vtype, pcrpid, fe_id); + + if ((fccGetFD() == -1) || (fccSetPids(fe_id, vpid, vtype, pcrpid) < 0) || (fccStart() < 0)) + { + fccFreeFD(); + return -1; + } + + m_fcc_enable = true; + + return 0; +} + +RESULT eTSMPEGDecoder::fccDecoderStart() +{ + if (m_fcc_fd == -1) + return -1; + + if (m_fcc_state != fcc_state_ready) + { + eDebug("FCC decoder is already in decoding state."); + return 0; + } + + if (ioctl(m_fcc_fd, FCC_DECODER_START) < 0) + { + eDebug("ioctl FCC_DECODER_START failed! (%m)"); + return -1; + } + + m_fcc_state = fcc_state_decoding; + + eDebug("[eTSMPEGDecoder] FCC_DECODER_START OK!"); + return 0; +} + +RESULT eTSMPEGDecoder::fccDecoderStop() +{ + if (m_fcc_fd == -1) + return -1; + + if (m_fcc_state != fcc_state_decoding) + { + eDebug("FCC decoder is not in decoding state."); + } + else if (ioctl(m_fcc_fd, FCC_DECODER_STOP) < 0) + { + eDebug("ioctl FCC_DECODER_STOP failed! (%m)"); + return -1; + } + + m_fcc_state = fcc_state_ready; + + /* stop pcr, video, audio, text */ + finishShowSinglePic(); + + m_vpid = m_apid = m_pcrpid = m_textpid = pidNone; + m_changed = -1; + setState(); + + eDebug("[eTSMPEGDecoder] FCC_DECODER_STOP OK!"); + return 0; +} + +RESULT eTSMPEGDecoder::fccUpdatePids(int fe_id, int vpid, int vtype, int pcrpid) +{ + //eDebug("[eTSMPEGDecoder] vp : %d, vt : %d, pp : %d, fe : %d", vpid, vtype, pcrpid, fe_id); + + if ((fe_id != m_fcc_feid) || (vpid != m_fcc_vpid) || (vtype != m_fcc_vtype) || (pcrpid != m_fcc_pcrpid)) + { + int cur_fcc_state = m_fcc_state; + fccStop(); + if (prepareFCC(fe_id, vpid, vtype, pcrpid)) + { + eDebug("[eTSMPEGDecoder] prepare FCC failed!"); + return -1; + } + } + return 0; +} + +RESULT eTSMPEGDecoder::fccStart() +{ + if (m_fcc_fd == -1) + return -1; + + if (m_fcc_state != fcc_state_stop) + { + eDebug("[eTSMPEGDecoder] FCC is already started!"); + return 0; + } + else if (ioctl(m_fcc_fd, FCC_START) < 0) + { + eDebug("ioctl FCC_START failed! (%m)"); + return -1; + } + + eDebug("[eTSMPEGDecoder] FCC_START OK!"); + + m_fcc_state = fcc_state_ready; + return 0; +} + +RESULT eTSMPEGDecoder::fccStop() +{ + if (m_fcc_fd == -1) + return -1; + + if (m_fcc_state == fcc_state_stop) + { + eDebug("[eTSMPEGDecoder] FCC is already stopped!"); + return 0; + } + + else if (m_fcc_state == fcc_state_decoding) + { + fccDecoderStop(); + } + + if (ioctl(m_fcc_fd, FCC_STOP) < 0) + { + eDebug("ioctl FCC_STOP failed! (%m)"); + return -1; + } + + m_fcc_state = fcc_state_stop; + + eDebug("[eTSMPEGDecoder] FCC_STOP OK!"); + return 0; +} + +RESULT eTSMPEGDecoder::fccSetPids(int fe_id, int vpid, int vtype, int pcrpid) +{ + int streamtype = VIDEO_STREAMTYPE_MPEG2; + + if (m_fcc_fd == -1) + return -1; + + if (ioctl(m_fcc_fd, FCC_SET_FRONTEND_ID, fe_id) < 0) + { + eDebug("[eTSMPEGDecoder] FCC_SET_FRONTEND_ID failed! (%m)"); + return -1; + } + + else if(ioctl(m_fcc_fd, FCC_SET_PCRPID, pcrpid) < 0) + { + eDebug("[eTSMPEGDecoder] FCC_SET_PCRPID failed! (%m)"); + return -1; + } + + else if (ioctl(m_fcc_fd, FCC_SET_VPID, vpid) < 0) + { + eDebug("[eTSMPEGDecoder] FCC_SET_VPID failed! (%m)"); + return -1; + } + + switch(vtype) + { + default: + case eDVBVideo::MPEG2: + break; + case eDVBVideo::MPEG4_H264: + streamtype = VIDEO_STREAMTYPE_MPEG4_H264; + break; + case eDVBVideo::MPEG1: + streamtype = VIDEO_STREAMTYPE_MPEG1; + break; + case eDVBVideo::MPEG4_Part2: + streamtype = VIDEO_STREAMTYPE_MPEG4_Part2; + break; + case eDVBVideo::VC1: + streamtype = VIDEO_STREAMTYPE_VC1; + break; + case eDVBVideo::VC1_SM: + streamtype = VIDEO_STREAMTYPE_VC1_SM; + break; + case eDVBVideo::H265_HEVC: + streamtype = VIDEO_STREAMTYPE_H265_HEVC; + break; + } + + if(ioctl(m_fcc_fd, FCC_SET_VCODEC, streamtype) < 0) + { + eDebug("[eTSMPEGDecoder] FCC_SET_VCODEC failed! (%m)"); + return -1; + } + + m_fcc_feid = fe_id; + m_fcc_vpid = vpid; + m_fcc_vtype = vtype; + m_fcc_pcrpid = pcrpid; + + //eDebug("[eTSMPEGDecoder] SET PIDS OK!"); + return 0; +} + +RESULT eTSMPEGDecoder::fccGetFD() +{ + if (m_fcc_fd == -1) + { + eFCCDecoder* fcc = eFCCDecoder::getInstance(); + if (fcc != NULL) + { + m_fcc_fd = fcc->allocateFcc(); + } + } + + return m_fcc_fd; +} + +RESULT eTSMPEGDecoder::fccFreeFD() +{ + if (m_fcc_fd != -1) + { + eFCCDecoder* fcc = eFCCDecoder::getInstance(); + if (fcc != NULL) + { + fcc->freeFcc(m_fcc_fd); + m_fcc_fd = -1; + } + } + + return 0; +} +