return 0;
}
- if (passthrough) {
- // TODO coding
- } else {
- //VideoOMX* video=(VideoOMX*)Video::getInstance();
-
- /*if (disport) {
- if (!video->ChangeComponentState(omx_aud_rend, OMX_StateIdle)) {
- Log::getInstance()->log("Audio", Log::DEBUG,
- "omx_aud_rend ChangeComponentState Execute CAP");
- return 0;
- }
- video->DisablePort(omx_aud_rend,omx_rend_input_port,false);
- DestroyInputBufsOMX();
- }*/
-
-
-
+ switch (encoding) {
+ case OMX_AUDIO_CodingPCM: {
OMX_AUDIO_PARAM_PCMMODETYPE audio_pcm;
memset(&audio_pcm, 0, sizeof(audio_pcm));
audio_pcm.nSize = sizeof(audio_pcm);
omx_rend_input_port);
return 0;
}
- /*if (disport) {
- video->EnablePort(omx_aud_rend,omx_rend_input_port,false);
- PrepareInputBufsOMX();
- if (!video->ChangeComponentState(omx_aud_rend, OMX_StateExecuting)) {
- Log::getInstance()->log("Audio", Log::DEBUG,
- "omx_aud_rend ChangeComponentState Execute CAP");
- return 0;
- }
+ } break;
+ case OMX_AUDIO_CodingDDP: {
+ OMX_AUDIO_PARAM_DDPTYPE audio_ddp;
+ memset(&audio_ddp, 0, sizeof(audio_ddp));
+ audio_ddp.nSize = sizeof(audio_ddp);
+ audio_ddp.nVersion.nVersion = OMX_VERSION;
+ audio_ddp.nPortIndex = omx_rend_input_port;
+ audio_ddp.nChannels = 8; //unknown
+ audio_ddp.nBitRate=0;
+ audio_ddp.nSampleRate=48000;
+ audio_ddp.eChannelMapping[0] =OMX_AUDIO_ChannelLF;
+ audio_ddp.eChannelMapping[1] =OMX_AUDIO_ChannelRF;
+ audio_ddp.eChannelMapping[2] =OMX_AUDIO_ChannelCF;
+ audio_ddp.eChannelMapping[3] =OMX_AUDIO_ChannelLFE;
+ audio_ddp.eChannelMapping[4] =OMX_AUDIO_ChannelLR;
+ audio_ddp.eChannelMapping[5] =OMX_AUDIO_ChannelRR;
+ audio_ddp.eChannelMapping[6] =OMX_AUDIO_ChannelLS;
+ audio_ddp.eChannelMapping[7] =OMX_AUDIO_ChannelRS;
+ audio_ddp.eChannelMapping[8] =OMX_AUDIO_ChannelCS;
+ error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioDdp,
+ &audio_ddp);
+ if (error != OMX_ErrorNone) {
+ Log::getInstance()->log("Audio", Log::DEBUG,
+ "Init OMX_IndexParamAudioDdp failed %x %d", error,
+ omx_rend_input_port);
+ return 0;
+ }
+
+ } break;
+ };
- }*/
- }
}
\r
#define DEMUXER_SEQ_HEAD 0x000001B3\r
#define DEMUXER_PIC_HEAD 0x00000101\r
+#define DEMUXER_SEQ_EXT_HEAD 0x000001B5\r
\r
#define DEMUXER_H264_ACCESS_UNIT 0x00000109\r
#define DEMUXER_H264_SEQ_PARAMETER_SET 0x00000107\r
+#define DEMUXER_H264_SUB_ENHANCEMENT_INF 0x00000106\r
\r
\r
#define SEEK_THRESHOLD 150000 // About 1.5 seconds\r
return seq_header;\r
}\r
\r
+UINT PESPacket::findSeqExtHeader(bool h264) const\r
+{\r
+ if (seq_header != 1) return seq_header;\r
+ if (size < 12) return 0;\r
+ UINT pattern = ( ((UINT)data[ 8] << 24) |\r
+ ((UINT)data[ 9] << 16) |\r
+ ((UINT)data[10] << 8) |\r
+ (UINT)data[11] );\r
+ UINT pos = 11;\r
+ if (h264) {\r
+ while ((pattern & 0xFFFFFF1F) != DEMUXER_H264_SUB_ENHANCEMENT_INF)\r
+ {\r
+ if (++pos >= size)\r
+ {\r
+ seq_header = 0;\r
+ return 0;\r
+ }\r
+ pattern = (pattern << 8) | data[pos];\r
+ }\r
+ seq_header = pos - 3;\r
+ }\r
+ else\r
+ {\r
+ while (pattern != DEMUXER_SEQ_EXT_HEAD && (data[pos+1]&0xf0)!=0x10)\r
+ {\r
+ if (++pos >= (size-1))\r
+ {\r
+ seq_header = 0;\r
+ return 0;\r
+ }\r
+ pattern = (pattern << 8) | data[pos];\r
+ }\r
+ seq_header = pos - 3;\r
+ }\r
+ return seq_header;\r
+}\r
+\r
// Demuxer methods\r
Demuxer::Demuxer()\r
{\r
flush();\r
video_current = audio_current = teletext_current = subtitle_current = -1;\r
horizontal_size = vertical_size = 0;\r
+ interlaced=true; // default is true\r
aspect_ratio = (enum AspectRatio) 0;\r
frame_rate = bit_rate = 0;\r
ispre_1_3_19 = false;\r
horizontal_size=(nalu.getUe()+1)*16;\r
\r
vertical_size=(nalu.getUe()+1)*16;\r
- int interlaced=nalu.getBits(1);\r
- vertical_size*=(2-interlaced);\r
+ int tinterlaced=nalu.getBits(1);\r
+ vertical_size*=(2-tinterlaced);\r
+ interlaced=!tinterlaced;\r
\r
- if (!interlaced) nalu.getBits(1);\r
+ if (!tinterlaced) nalu.getBits(1);\r
nalu.getBits(1);\r
if (nalu.getBits(1))\r
{\r
horizontal_size-=nalu.getUe()*chromunitx;\r
horizontal_size-=nalu.getUe()*chromunitx;\r
- vertical_size-=nalu.getUe()*(2-interlaced)*chromunity;\r
- vertical_size-=nalu.getUe()*(2-interlaced)*chromunity;\r
+ vertical_size-=nalu.getUe()*(2-tinterlaced)*chromunity;\r
+ vertical_size-=nalu.getUe()*(2-tinterlaced)*chromunity;\r
}\r
if (nalu.getBits(1))\r
{\r
}\r
\r
}\r
+ UINT posext = packet.findSeqExtHeader(h264);\r
+ if (posext>1) {\r
+ if (!h264) {\r
+ interlaced=!(packet[pos+1] & 0x08); //really simple\r
+ // if more than full hd is coming we need to add additional parsers here\r
+ } else {\r
+ /* NALUUnit nalu(packet.getData()+posext,packet.getSize()-posext);\r
+ while (!nalu.isEonalu()) {\r
+ unsigned int payloadtype=0;\r
+ unsigned int payloadadd=0xFF;\r
+ while (payloadadd==0xFF && !nalu.isEonalu()) {\r
+ payloadadd=nalu.getBits(8);\r
+ payloadtype+=payloadadd;\r
+ }\r
+ unsigned int payloadsize=0;\r
+ payloadadd=0xff;\r
+ while (payloadadd==0xFF && !nalu.isEonalu()) {\r
+ payloadadd=nalu.getBits(8);\r
+ payloadsize+=payloadadd;\r
+ }\r
+ switch (payloadtype) {\r
+ case 1: { // picture timing SEI\r
+\r
+ } break;\r
+ default: {\r
+ while (payloadsize) { // not handled skip\r
+ nalu.getBits(8);\r
+ payloadsize--;\r
+ }\r
+ } break;\r
+ }\r
+\r
+\r
+\r
+ }*/\r
+\r
+\r
+ }\r
+ }\r
\r
if (vid_seeking)\r
{\r
\r
UINT findPictureHeader(bool h264) const;\r
UINT findSeqHeader(bool h264) const;\r
+ UINT findSeqExtHeader(bool h264) const;\r
UINT countPictureHeaders(bool h264) const;\r
static const ULLONG PTS_INVALID = (1LL << 33);\r
\r
int getAspectRatio() { return aspect_ratio; }\r
int getFrameRate() { return frame_rate; }\r
int getBitRate() { return bit_rate; }\r
+ bool getInterlaced() { return interlaced;}\r
ULLONG getVideoPTS() { return video_pts; }\r
ULLONG getAudioPTS() { return audio_pts; }\r
\r
\r
int horizontal_size;\r
int vertical_size;\r
+ bool interlaced;\r
int profile;\r
enum AspectRatio aspect_ratio;\r
int arcnt;\r
Log::getInstance()->log("Video", Log::NOTICE, "Allocate Codecs OMX");
//Clock, move later to audio including events
- if (deinterlace!=0 && (demux->getHorizontalSize()<=720 /*|| demux->getHorizontalSize()==1920*/)) { //only deinterlace SD material
+ Log::getInstance()->log("Video", Log::NOTICE, "VideoType %d x %d i: %d", demux->getHorizontalSize(),demux->getVerticalSize(),demux->getInterlaced());
+ if (deinterlace!=0 && (demux->getHorizontalSize()<=720 ) && demux->getInterlaced()) { //only deinterlace SD material
dodeint=true;
deint_first_frame=true;