return true;
}
+bool COMXVideo::NaluFormatStartCodes(enum CodecID codec, uint8_t *in_extradata, int in_extrasize)
+{
+ switch(codec)
+ {
+ case CODEC_ID_H264:
+ if (in_extrasize < 7 || in_extradata == NULL)
+ return true;
+ // valid avcC atom data always starts with the value 1 (version), otherwise annexb
+ else if ( *in_extradata != 1 )
+ return true;
+ default: break;
+ }
+ return false;
+}
+
bool COMXVideo::Open(CDVDStreamInfo &hints, OMXClock *clock, bool deinterlace, bool hdmi_clock_sync)
{
if(m_is_open)
if(!m_decoded_width || !m_decoded_height)
return false;
- m_converter = new CBitstreamConverter();
- m_video_convert = m_converter->Open(hints.codec, (uint8_t *)hints.extradata, hints.extrasize, false);
-
- if(m_video_convert)
- {
- if(m_converter->GetExtraData() != NULL && m_converter->GetExtraSize() > 0)
- {
- m_extrasize = m_converter->GetExtraSize();
- m_extradata = (uint8_t *)malloc(m_extrasize);
- memcpy(m_extradata, m_converter->GetExtraData(), m_converter->GetExtraSize());
- }
- }
- else
+ if(hints.extrasize > 0 && hints.extradata != NULL)
{
- if(hints.extrasize > 0 && hints.extradata != NULL)
- {
- m_extrasize = hints.extrasize;
- m_extradata = (uint8_t *)malloc(m_extrasize);
- memcpy(m_extradata, hints.extradata, hints.extrasize);
- }
+ m_extrasize = hints.extrasize;
+ m_extradata = (uint8_t *)malloc(m_extrasize);
+ memcpy(m_extradata, hints.extradata, hints.extrasize);
}
+ m_converter = new CBitstreamConverter();
+ m_video_convert = m_converter->Open(hints.codec, (uint8_t *)hints.extradata, hints.extrasize, false);
+
switch (hints.codec)
{
case CODEC_ID_H264:
}
/* check interlaced */
- uint8_t *extradata = (uint8_t *)hints.extradata;
- if(hints.extrasize > 9 && extradata[0] == 1)
+ if(m_extrasize > 9 && m_extradata[0] == 1)
{
int32_t max_ref_frames = 0;
- uint8_t *spc = extradata + 6;
+ uint8_t *spc = m_extradata + 6;
uint32_t sps_size = BS_RB16(spc);
bool interlaced = true;
if (sps_size)
return false;
}
+ if(NaluFormatStartCodes(hints.codec, m_extradata, m_extrasize))
+ {
+ OMX_NALSTREAMFORMATTYPE nalStreamFormat;
+ OMX_INIT_STRUCTURE(nalStreamFormat);
+ nalStreamFormat.nPortIndex = m_omx_decoder.GetInputPort();
+ nalStreamFormat.eNaluFormat = OMX_NaluFormatStartCodes;
+
+ omx_err = m_omx_decoder.SetParameter((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormatSelect, &nalStreamFormat);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXVideo::Open OMX_IndexParamNalStreamFormatSelect error (0%08x)\n", omx_err);
+ return false;
+ }
+ }
+
if(m_hdmi_clock_sync)
{
OMX_CONFIG_LATENCYTARGETTYPE latencyTarget;