Skip to content

Commit 2051027

Browse files
committedJan 23, 2013
Pick up some fixes from xbmc.
Fix h264 in avi file timestamps. Add extra buffer when deinterlacing to avoid hanging. Remove bitstream converter and get GPU to do it.
1 parent b3beefb commit 2051027

File tree

4 files changed

+90
-77
lines changed

4 files changed

+90
-77
lines changed
 

‎DllBCM.h

+22-34
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,12 @@ class DllBcmHostInterface
4747
virtual void bcm_host_init() = 0;
4848
virtual void bcm_host_deinit() = 0;
4949
virtual int32_t graphics_get_display_size( const uint16_t display_number, uint32_t *width, uint32_t *height) = 0;
50-
virtual int vc_tv_hdmi_power_on_best(uint32_t width, uint32_t height, uint32_t frame_rate,
51-
HDMI_INTERLACED_T scan_mode, EDID_MODE_MATCH_FLAG_T match_flags) = 0;
52-
virtual int vc_tv_hdmi_power_on_best_3d(uint32_t width, uint32_t height, uint32_t frame_rate,
53-
HDMI_INTERLACED_T scan_mode, EDID_MODE_MATCH_FLAG_T match_flags) = 0;
54-
55-
virtual int vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_T group, TV_SUPPORTED_MODE_T *supported_modes,
50+
virtual int vc_tv_hdmi_get_supported_modes_new(HDMI_RES_GROUP_T group, TV_SUPPORTED_MODE_NEW_T *supported_modes,
5651
uint32_t max_supported_modes, HDMI_RES_GROUP_T *preferred_group,
5752
uint32_t *preferred_mode) = 0;
58-
virtual int vc_tv_hdmi_power_on_explicit(HDMI_MODE_T mode, HDMI_RES_GROUP_T group, uint32_t code) = 0;
59-
virtual int vc_tv_get_state(TV_GET_STATE_RESP_T *tvstate) = 0;
53+
virtual int vc_tv_hdmi_power_on_explicit_new(HDMI_MODE_T mode, HDMI_RES_GROUP_T group, uint32_t code) = 0;
54+
virtual int vc_tv_hdmi_set_property(const HDMI_PROPERTY_PARAM_T *property) = 0;
55+
virtual int vc_tv_get_display_state(TV_DISPLAY_STATE_T *tvstate) = 0;
6056
virtual int vc_tv_show_info(uint32_t show) = 0;
6157
virtual int vc_gencmd(char *response, int maxlen, const char *string) = 0;
6258
virtual void vc_tv_register_callback(TVSERVICE_CALLBACK_T callback, void *callback_data) = 0;
@@ -90,20 +86,16 @@ class DllBcmHost : public DllDynamic, DllBcmHostInterface
9086
{ return ::bcm_host_deinit(); };
9187
virtual int32_t graphics_get_display_size( const uint16_t display_number, uint32_t *width, uint32_t *height)
9288
{ return ::graphics_get_display_size(display_number, width, height); };
93-
virtual int vc_tv_hdmi_power_on_best(uint32_t width, uint32_t height, uint32_t frame_rate,
94-
HDMI_INTERLACED_T scan_mode, EDID_MODE_MATCH_FLAG_T match_flags)
95-
{ return ::vc_tv_hdmi_power_on_best(width, height, frame_rate, scan_mode, match_flags); };
96-
virtual int vc_tv_hdmi_power_on_best_3d(uint32_t width, uint32_t height, uint32_t frame_rate,
97-
HDMI_INTERLACED_T scan_mode, EDID_MODE_MATCH_FLAG_T match_flags)
98-
{ return ::vc_tv_hdmi_power_on_best_3d(width, height, frame_rate, scan_mode, match_flags); };
99-
virtual int vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_T group, TV_SUPPORTED_MODE_T *supported_modes,
89+
virtual int vc_tv_hdmi_get_supported_modes_new(HDMI_RES_GROUP_T group, TV_SUPPORTED_MODE_NEW_T *supported_modes,
10090
uint32_t max_supported_modes, HDMI_RES_GROUP_T *preferred_group,
10191
uint32_t *preferred_mode)
102-
{ return ::vc_tv_hdmi_get_supported_modes(group, supported_modes, max_supported_modes, preferred_group, preferred_mode); };
103-
virtual int vc_tv_hdmi_power_on_explicit(HDMI_MODE_T mode, HDMI_RES_GROUP_T group, uint32_t code)
104-
{ return ::vc_tv_hdmi_power_on_explicit(mode, group, code); };
105-
virtual int vc_tv_get_state(TV_GET_STATE_RESP_T *tvstate)
106-
{ return ::vc_tv_get_state(tvstate); };
92+
{ return ::vc_tv_hdmi_get_supported_modes_new(group, supported_modes, max_supported_modes, preferred_group, preferred_mode); };
93+
virtual int vc_tv_hdmi_power_on_explicit_new(HDMI_MODE_T mode, HDMI_RES_GROUP_T group, uint32_t code)
94+
{ return ::vc_tv_hdmi_power_on_explicit_new(mode, group, code); };
95+
virtual int vc_tv_hdmi_set_property(const HDMI_PROPERTY_PARAM_T *property)
96+
{ return ::vc_tv_hdmi_set_property(property); }
97+
virtual int vc_tv_get_display_state(TV_DISPLAY_STATE_T *tvstate)
98+
{ return ::vc_tv_get_display_state(tvstate); };
10799
virtual int vc_tv_show_info(uint32_t show)
108100
{ return ::vc_tv_show_info(show); };
109101
virtual int vc_gencmd(char *response, int maxlen, const char *string)
@@ -157,16 +149,13 @@ class DllBcmHost : public DllDynamic, DllBcmHostInterface
157149
DEFINE_METHOD0(void, bcm_host_init)
158150
DEFINE_METHOD0(void, bcm_host_deinit)
159151
DEFINE_METHOD3(int32_t, graphics_get_display_size, (const uint16_t p1, uint32_t *p2, uint32_t *p3))
160-
DEFINE_METHOD5(int, vc_tv_hdmi_power_on_best, (uint32_t p1, uint32_t p2, uint32_t p3,
161-
HDMI_INTERLACED_T p4, EDID_MODE_MATCH_FLAG_T p5))
162-
DEFINE_METHOD5(int, vc_tv_hdmi_power_on_best_3d, (uint32_t p1, uint32_t p2, uint32_t p3,
163-
HDMI_INTERLACED_T p4, EDID_MODE_MATCH_FLAG_T p5))
164-
DEFINE_METHOD5(int, vc_tv_hdmi_get_supported_modes, (HDMI_RES_GROUP_T p1, TV_SUPPORTED_MODE_T *p2,
152+
DEFINE_METHOD5(int, vc_tv_hdmi_get_supported_modes_new, (HDMI_RES_GROUP_T p1, TV_SUPPORTED_MODE_NEW_T *p2,
165153
uint32_t p3, HDMI_RES_GROUP_T *p4, uint32_t *p5))
166-
DEFINE_METHOD3(int, vc_tv_hdmi_power_on_explicit, (HDMI_MODE_T p1, HDMI_RES_GROUP_T p2, uint32_t p3))
167-
DEFINE_METHOD1(int, vc_tv_get_state, (TV_GET_STATE_RESP_T *p1))
168-
DEFINE_METHOD1(int, vc_tv_show_info, (uint32_t p1))
169-
DEFINE_METHOD3(int, vc_gencmd, (char *p1, int p2, const char *p3))
154+
DEFINE_METHOD3(int, vc_tv_hdmi_power_on_explicit_new, (HDMI_MODE_T p1, HDMI_RES_GROUP_T p2, uint32_t p3))
155+
DEFINE_METHOD1(int, vc_tv_hdmi_set_property, (const HDMI_PROPERTY_PARAM_T *property))
156+
DEFINE_METHOD1(int, vc_tv_get_display_state, (TV_DISPLAY_STATE_T *p1))
157+
DEFINE_METHOD1(int, vc_tv_show_info, (uint32_t p1))
158+
DEFINE_METHOD3(int, vc_gencmd, (char *p1, int p2, const char *p3))
170159

171160
DEFINE_METHOD2(void, vc_tv_register_callback, (TVSERVICE_CALLBACK_T p1, void *p2))
172161
DEFINE_METHOD1(void, vc_tv_unregister_callback, (TVSERVICE_CALLBACK_T p1))
@@ -192,11 +181,10 @@ class DllBcmHost : public DllDynamic, DllBcmHostInterface
192181
RESOLVE_METHOD(bcm_host_init)
193182
RESOLVE_METHOD(bcm_host_deinit)
194183
RESOLVE_METHOD(graphics_get_display_size)
195-
RESOLVE_METHOD(vc_tv_hdmi_power_on_best)
196-
RESOLVE_METHOD(vc_tv_hdmi_power_on_best_3d)
197-
RESOLVE_METHOD(vc_tv_hdmi_get_supported_modes)
198-
RESOLVE_METHOD(vc_tv_hdmi_power_on_explicit)
199-
RESOLVE_METHOD(vc_tv_get_state)
184+
RESOLVE_METHOD(vc_tv_hdmi_get_supported_modes_new)
185+
RESOLVE_METHOD(vc_tv_hdmi_power_on_explicit_new)
186+
RESOLVE_METHOD(vc_tv_hdmi_set_property)
187+
RESOLVE_METHOD(vc_tv_get_display_state)
200188
RESOLVE_METHOD(vc_tv_show_info)
201189
RESOLVE_METHOD(vc_gencmd)
202190
RESOLVE_METHOD(vc_tv_register_callback)

‎OMXReader.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -818,9 +818,6 @@ bool OMXReader::GetHints(AVStream *stream, COMXStreamInfo *hints)
818818
if(!hints || !stream)
819819
return false;
820820

821-
hints->codec = stream->codec->codec_id;
822-
hints->extradata = stream->codec->extradata;
823-
hints->extrasize = stream->codec->extradata_size;
824821
hints->codec = stream->codec->codec_id;
825822
hints->extradata = stream->codec->extradata;
826823
hints->extrasize = stream->codec->extradata_size;
@@ -863,6 +860,8 @@ bool OMXReader::GetHints(AVStream *stream, COMXStreamInfo *hints)
863860
hints->aspect = av_q2d(stream->codec->sample_aspect_ratio) * stream->codec->width / stream->codec->height;
864861
else
865862
hints->aspect = 0.0f;
863+
if (m_bAVI && stream->codec->codec_id == CODEC_ID_H264)
864+
hints->ptsinvalid = true;
866865
}
867866

868867
return true;

‎OMXVideo.cpp

+65-36
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ COMXVideo::COMXVideo()
7777
m_setStartTimeText = true;
7878
m_extradata = NULL;
7979
m_extrasize = 0;
80-
m_converter = NULL;
81-
m_video_convert = false;
8280
m_video_codec_name = "";
8381
m_deinterlace = false;
8482
m_hdmi_clock_sync = false;
@@ -129,6 +127,21 @@ bool COMXVideo::SendDecoderConfig()
129127
return true;
130128
}
131129

130+
bool COMXVideo::NaluFormatStartCodes(enum CodecID codec, uint8_t *in_extradata, int in_extrasize)
131+
{
132+
switch(codec)
133+
{
134+
case CODEC_ID_H264:
135+
if (in_extrasize < 7 || in_extradata == NULL)
136+
return true;
137+
// valid avcC atom data always starts with the value 1 (version), otherwise annexb
138+
else if ( *in_extradata != 1 )
139+
return true;
140+
default: break;
141+
}
142+
return false;
143+
}
144+
132145
bool COMXVideo::Open(COMXStreamInfo &hints, OMXClock *clock, float display_aspect, bool deinterlace, bool hdmi_clock_sync)
133146
{
134147
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
@@ -145,26 +158,11 @@ bool COMXVideo::Open(COMXStreamInfo &hints, OMXClock *clock, float display_aspec
145158
if(!m_decoded_width || !m_decoded_height)
146159
return false;
147160

148-
m_converter = new CBitstreamConverter();
149-
m_video_convert = m_converter->Open(hints.codec, (uint8_t *)hints.extradata, hints.extrasize, false);
150-
151-
if(m_video_convert)
152-
{
153-
if(m_converter->GetExtraData() != NULL && m_converter->GetExtraSize() > 0)
154-
{
155-
m_extrasize = m_converter->GetExtraSize();
156-
m_extradata = (uint8_t *)malloc(m_extrasize);
157-
memcpy(m_extradata, m_converter->GetExtraData(), m_converter->GetExtraSize());
158-
}
159-
}
160-
else
161+
if(hints.extrasize > 0 && hints.extradata != NULL)
161162
{
162-
if(hints.extrasize > 0 && hints.extradata != NULL)
163-
{
164-
m_extrasize = hints.extrasize;
165-
m_extradata = (uint8_t *)malloc(m_extrasize);
166-
memcpy(m_extradata, hints.extradata, hints.extrasize);
167-
}
163+
m_extrasize = hints.extrasize;
164+
m_extradata = (uint8_t *)malloc(m_extrasize);
165+
memcpy(m_extradata, hints.extradata, hints.extrasize);
168166
}
169167

170168
switch (hints.codec)
@@ -378,6 +376,52 @@ bool COMXVideo::Open(COMXStreamInfo &hints, OMXClock *clock, float display_aspec
378376
return false;
379377
}
380378

379+
if (m_deinterlace)
380+
{
381+
// the deinterlace component requires 3 additional video buffers in addition to the DPB (this is normally 2).
382+
OMX_PARAM_U32TYPE extra_buffers;
383+
OMX_INIT_STRUCTURE(extra_buffers);
384+
extra_buffers.nU32 = 3;
385+
386+
omx_err = m_omx_decoder.SetParameter(OMX_IndexParamBrcmExtraBuffers, &extra_buffers);
387+
if(omx_err != OMX_ErrorNone)
388+
{
389+
CLog::Log(LOGERROR, "COMXVideo::Open error OMX_IndexParamBrcmExtraBuffers omx_err(0x%08x)\n", omx_err);
390+
return false;
391+
}
392+
}
393+
394+
// broadcom omx entension:
395+
// When enabled, the timestamp fifo mode will change the way incoming timestamps are associated with output images.
396+
// In this mode the incoming timestamps get used without re-ordering on output images.
397+
if(hints.ptsinvalid)
398+
{
399+
OMX_CONFIG_BOOLEANTYPE timeStampMode;
400+
OMX_INIT_STRUCTURE(timeStampMode);
401+
timeStampMode.bEnabled = OMX_TRUE;
402+
omx_err = m_omx_decoder.SetParameter((OMX_INDEXTYPE)OMX_IndexParamBrcmVideoTimestampFifo, &timeStampMode);
403+
if (omx_err != OMX_ErrorNone)
404+
{
405+
CLog::Log(LOGERROR, "COMXVideo::Open OMX_IndexParamBrcmVideoTimestampFifo error (0%08x)\n", omx_err);
406+
return false;
407+
}
408+
}
409+
410+
if(NaluFormatStartCodes(hints.codec, m_extradata, m_extrasize))
411+
{
412+
OMX_NALSTREAMFORMATTYPE nalStreamFormat;
413+
OMX_INIT_STRUCTURE(nalStreamFormat);
414+
nalStreamFormat.nPortIndex = m_omx_decoder.GetInputPort();
415+
nalStreamFormat.eNaluFormat = OMX_NaluFormatStartCodes;
416+
417+
omx_err = m_omx_decoder.SetParameter((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormatSelect, &nalStreamFormat);
418+
if (omx_err != OMX_ErrorNone)
419+
{
420+
CLog::Log(LOGERROR, "COMXVideo::Open OMX_IndexParamNalStreamFormatSelect error (0%08x)\n", omx_err);
421+
return false;
422+
}
423+
}
424+
381425
if(m_hdmi_clock_sync)
382426
{
383427
OMX_CONFIG_LATENCYTARGETTYPE latencyTarget;
@@ -684,10 +728,6 @@ void COMXVideo::Close()
684728
m_extradata = NULL;
685729
m_extrasize = 0;
686730

687-
if(m_converter)
688-
delete m_converter;
689-
m_converter = NULL;
690-
m_video_convert = false;
691731
m_video_codec_name = "";
692732
m_deinterlace = false;
693733
m_first_frame = true;
@@ -827,17 +867,6 @@ int COMXVideo::Decode(uint8_t *pData, int iSize, double dts, double pts)
827867
unsigned int demuxer_bytes = (unsigned int)iSize;
828868
uint8_t *demuxer_content = pData;
829869

830-
if(m_video_convert)
831-
{
832-
m_converter->Convert(pData, iSize);
833-
demuxer_bytes = m_converter->GetConvertSize();
834-
demuxer_content = m_converter->GetConvertBuffer();
835-
if(!demuxer_bytes && demuxer_bytes < 1)
836-
{
837-
return false;
838-
}
839-
}
840-
841870
while(demuxer_bytes)
842871
{
843872
// 500ms timeout

‎OMXVideo.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727

2828
#include <IL/OMX_Video.h>
2929

30-
#include "BitstreamConverter.h"
31-
3230
#include "OMXClock.h"
3331
#include "OMXReader.h"
3432

@@ -49,6 +47,7 @@ class COMXVideo
4947

5048
// Required overrides
5149
bool SendDecoderConfig();
50+
bool NaluFormatStartCodes(enum CodecID codec, uint8_t *in_extradata, int in_extrasize);
5251
bool Open(COMXStreamInfo &hints, OMXClock *clock, float display_aspect = 0.0f, bool deinterlace = false, bool hdmi_clock_sync = false);
5352
void Close(void);
5453
unsigned int GetFreeSpace();
@@ -94,8 +93,6 @@ class COMXVideo
9493
uint8_t *m_extradata;
9594
int m_extrasize;
9695

97-
CBitstreamConverter *m_converter;
98-
bool m_video_convert;
9996
std::string m_video_codec_name;
10097

10198
bool m_deinterlace;

0 commit comments

Comments
 (0)
Please sign in to comment.