]> git.vomp.tv Git - vompclient.git/commitdiff
Preparations for AC3 passthrough and parser for deinterlacing
authorMarten Richter <marten.richter@freenet.de>
Sat, 20 Oct 2012 10:38:10 +0000 (12:38 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sat, 20 Oct 2012 10:38:10 +0000 (12:38 +0200)
audioomx.cc
demuxer.cc
demuxer.h
videoomx.cc

index 0824869feb6dbe588c9ef12cba02282552a0e597..256051ba6c2b9f7fb31b639f076bdc995b8f7fb4 100644 (file)
@@ -582,23 +582,8 @@ int AudioOMX::ChangeAudioPortConfig(bool disport) //clock aka omx mutex needs to
                        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);
@@ -623,18 +608,38 @@ int AudioOMX::ChangeAudioPortConfig(bool disport) //clock aka omx mutex needs to
                                                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;
+               };
 
-                       }*/
 
-               }
        }
 
 
index 305c1a15f82702ceeab0ff2d4dc6fafecd6ecc8d..6aef0d134a587167d51d1c51de4fc4fcfeafa1ec 100644 (file)
 \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
@@ -372,6 +374,43 @@ UINT PESPacket::findSeqHeader(bool h264) const
   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
@@ -433,6 +472,7 @@ void Demuxer::reset()
   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
@@ -824,17 +864,18 @@ pre_1_3_19_Recording: //This is for old recordings stuff and live TV
                 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
@@ -872,6 +913,45 @@ pre_1_3_19_Recording: //This is for old recordings stuff and live TV
                 }\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
index 1db27496210fe8b9f84999676ee8f486ff1b7af0..b1474eebd3412a87b76d1fbdf764fc5ccecce222 100644 (file)
--- a/demuxer.h
+++ b/demuxer.h
@@ -62,6 +62,7 @@ class PESPacket
 \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
@@ -122,6 +123,7 @@ class Demuxer
     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
@@ -209,6 +211,7 @@ class Demuxer
 \r
     int horizontal_size;\r
     int vertical_size;\r
+    bool interlaced;\r
     int profile;\r
     enum AspectRatio aspect_ratio;\r
     int arcnt;\r
index a250f1081862aeb5d1a6bb796049e48dd79c4b8d..05966c04bd114afb52461463d678329196f69dd7 100644 (file)
@@ -829,7 +829,8 @@ int VideoOMX::AllocateCodecsOMX()
        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;