]> git.sesse.net Git - vlc/blobdiff - modules/demux/ps.h
PS: kill a warning about operator precedence
[vlc] / modules / demux / ps.h
index c432faa3eb35f656c9920d68fa57861a70712c5d..ba5fe903bcde8dca4da48b8c9c3d74bb2c7be706 100644 (file)
@@ -1,24 +1,24 @@
 /*****************************************************************************
  * ps.h: Program Stream demuxer helper
  *****************************************************************************
- * Copyright (C) 2004-2009 the VideoLAN team
+ * Copyright (C) 2004-2009 VLC authors and VideoLAN
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 #include <assert.h>
@@ -82,43 +82,44 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
 {
     tk->i_skip = 0;
     tk->i_id = i_id;
-    if( ( i_id&0xff00 ) == 0xbd00 )
+    if( ( i_id&0xff00 ) == 0xbd00 ) /* 0xBD00 -> 0xBDFF, Private Stream 1 */
     {
-        if( ( i_id&0xf8 ) == 0x88 || (i_id&0xf8) == 0x98 )
+        if( ( i_id&0xf8 ) == 0x88 || /* 0x88 -> 0x8f - Can be DTS-HD primary audio in evob */
+            ( i_id&0xf8 ) == 0x98 )  /* 0x98 -> 0x9f - Can be DTS-HD secondary audio in evob */
         {
             es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_DTS );
             tk->i_skip = 4;
         }
-        else if( ( i_id&0xf0 ) == 0x80
-               ||  (i_id&0xf0) == 0xc0 ) /* AC-3, Can also be used for DD+/E-AC-3 */
+        else if( ( i_id&0xf8 ) == 0x80 || /* 0x80 -> 0x87 */
+                 ( i_id&0xf0 ) == 0xc0 )  /* 0xc0 -> 0xcf AC-3, Can also be DD+/E-AC3 in evob */
         {
             es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_A52 );
             tk->i_skip = 4;
         }
-        else if( (i_id&0xf0) == 0xb0 )
+        else if( (i_id&0xf0) == 0xb0 ) /* 0xb0 -> 0xbf */
         {
             es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MLP );
-            /* FIXME / untested ... no known decoder (at least not in VLC/ffmpeg) */
+            /* FIXME / untested ... */
         }
-        else if( ( i_id&0xe0 ) == 0x20 )
+        else if( ( i_id&0xe0 ) == 0x20 ) /* 0x20 -> 0x3f */
         {
             es_format_Init( &tk->fmt, SPU_ES, VLC_CODEC_SPU );
             tk->i_skip = 1;
         }
-        else if( ( i_id&0xf0 ) == 0xa0 )
+        else if( ( i_id&0xf0 ) == 0xa0 ) /* 0xa0 -> 0xaf */
         {
             es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_DVD_LPCM );
             tk->i_skip = 1;
         }
-        else if( ( i_id&0xff ) == 0x70 )
+        else if( ( i_id&0xff ) == 0x70 ) /* 0x70 */
         {
             es_format_Init( &tk->fmt, SPU_ES, VLC_CODEC_OGT );
         }
-        else if( ( i_id&0xfc ) == 0x00 )
+        else if( ( i_id&0xfc ) == 0x00 ) /* 0x00 -> 0x03 */
         {
             es_format_Init( &tk->fmt, SPU_ES, VLC_CODEC_CVD );
         }
-        else if( ( i_id&0xff ) == 0x10 )
+        else if( ( i_id&0xff ) == 0x10 ) /* 0x10 */
         {
             es_format_Init( &tk->fmt, SPU_ES, VLC_CODEC_TELETEXT );
         }
@@ -128,10 +129,11 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
             return VLC_EGENERIC;
         }
     }
-    else if( (i_id&0xff00) == 0xfd00 )
+    else if( (i_id&0xff00) == 0xfd00 ) /* 0xFD00 -> 0xFDFF */
     {
         uint8_t i_sub_id = i_id & 0xff;
-        if( i_sub_id >= 0x55 && i_sub_id <= 0x5f )
+        if( ( i_sub_id >= 0x55 && i_sub_id <= 0x5f ) || /* Can be primary VC-1 in evob */
+            ( i_sub_id >= 0x75 && i_sub_id <= 0x7f ) )  /* Secondary VC-1 */
         {
             es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_VC1 );
         }
@@ -141,7 +143,7 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
             return VLC_EGENERIC;
         }
     }
-    else if( (i_id&0xff00) == 0xa000 )
+    else if( (i_id&0xff00) == 0xa000 ) /* 0xA000 -> 0xA0FF */
     {
         uint8_t i_sub_id = i_id & 0x07;
         if( i_sub_id == 0 )
@@ -166,38 +168,50 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
 
         es_format_Init( &tk->fmt, UNKNOWN_ES, 0 );
 
-        if( (i_id&0xf0) == 0xe0 && i_type == 0x1b )
+        if( (i_id&0xf0) == 0xe0 ) /* 0xe0 -> 0xef */
         {
-            es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_H264 );
-        }
-        else if( (i_id&0xf0) == 0xe0 && i_type == 0x10 )
-        {
-            es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_MP4V );
-        }
-        else if( (i_id&0xf0) == 0xe0 && i_type == 0x02 )
-        {
-            es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_MPGV );
-        }
-        else if( ( i_id&0xe0 ) == 0xc0 && i_type == 0x0f )
-        {
-            es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MP4A );
-        }
-        else if( ( i_id&0xe0 ) == 0xc0 && i_type == 0x11 )
-        {
-            es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MP4A );
-        }
-        else if( ( i_id&0xe0 ) == 0xc0 && i_type == 0x03 )
-        {
-            es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MPGA );
-        }
-
-        if( tk->fmt.i_cat == UNKNOWN_ES && ( i_id&0xf0 ) == 0xe0 )
-        {
-            es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_MPGV );
+            if( i_type == 0x1b )
+            {
+                es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_H264 );
+            }
+            else if( i_type == 0x10 )
+            {
+                es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_MP4V );
+            }
+            else if( i_type == 0x01 ||
+                     i_type == 0x02 )
+            {
+                es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_MPGV );
+            }
+            else if( i_id == 0xe2 || /* Primary H.264 in evob */
+                     i_id == 0xe3 )  /* Seconday H.264 in evob */
+            {
+                es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_H264 );
+            }
+            else if( tk->fmt.i_cat == UNKNOWN_ES )
+            {
+                es_format_Init( &tk->fmt, VIDEO_ES, VLC_CODEC_MPGV );
+            }
         }
-        else if( tk->fmt.i_cat == UNKNOWN_ES && ( i_id&0xe0 ) == 0xc0 )
+        else if( ( i_id&0xe0 ) == 0xc0 ) /* 0xc0 -> 0xdf */
         {
-            es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MPGA );
+            if( i_type == 0x03 ||
+                i_type == 0x04 )
+            {
+                es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MPGA );
+            }
+            else if( i_type == 0x0f )
+            {
+                es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MP4A );
+            }
+            else if( i_type == 0x11 )
+            {
+                es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MP4A );
+            }
+            else if( tk->fmt.i_cat == UNKNOWN_ES )
+            {
+                es_format_Init( &tk->fmt, AUDIO_ES, VLC_CODEC_MPGA );
+            }
         }
         else if( tk->fmt.i_cat == UNKNOWN_ES ) return VLC_EGENERIC;
     }
@@ -299,23 +313,24 @@ static inline int ps_pkt_id( block_t *p_pkt )
     return p_pkt->p_buffer[3];
 }
 
-/* return the size of the next packet
- * You need to give him at least 14 bytes (and it need to start as a
- * valid packet) It does not handle less than 6 bytes */
+/* return the size of the next packet */
 static inline int ps_pkt_size( const uint8_t *p, int i_peek )
 {
-    assert( i_peek >= 6 );
-    if( p[3] == 0xb9 && i_peek >= 4 )
+    if( unlikely(i_peek < 4) )
+    {
+        return -1;
+    }
+    else if( p[3] == 0xb9 )
     {
         return 4;
     }
     else if( p[3] == 0xba )
     {
-        if( (p[4] >> 6) == 0x01 && i_peek >= 14 )
+        if( i_peek >= 14 && (p[4] >> 6) == 0x01 )
         {
             return 14 + (p[13]&0x07);
         }
-        else if( (p[4] >> 4) == 0x02 && i_peek >= 12 )
+        else if( i_peek >= 12 && (p[4] >> 4) == 0x02 )
         {
             return 12;
         }
@@ -576,15 +591,15 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,
 {
     int i_buffer = p_pkt->i_buffer;
     uint8_t *p_buffer = p_pkt->p_buffer;
-    int i_length, i_version, i_info_length, i_esm_length, i_es_base;
+    int i_length, i_version, i_info_length, i_es_base;
 
     if( !p_psm || p_buffer[3] != 0xbc ) return VLC_EGENERIC;
 
     i_length = (uint16_t)(p_buffer[4] << 8) + p_buffer[5] + 6;
     if( i_length > i_buffer ) return VLC_EGENERIC;
 
-    //i_current_next_indicator = (p_buffer[6] && 0x01);
-    i_version = (p_buffer[6] && 0xf8);
+    //i_current_next_indicator = (p_buffer[6] & 0x01);
+    i_version = (p_buffer[6] & 0xf8);
 
     if( p_psm->i_version == i_version ) return VLC_EGENERIC;
 
@@ -594,8 +609,8 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,
     if( i_info_length + 10 > i_length ) return VLC_EGENERIC;
 
     /* Elementary stream map */
-    i_esm_length = (uint16_t)(p_buffer[ 10 + i_info_length ] << 8) +
-        p_buffer[ 11 + i_info_length];
+    /* int i_esm_length = (uint16_t)(p_buffer[ 10 + i_info_length ] << 8) +
+        p_buffer[ 11 + i_info_length]; */
     i_es_base = 12 + i_info_length;
 
     while( i_es_base + 4 < i_length )