]> git.sesse.net Git - vlc/commitdiff
mkv.cpp: improve the DVD conditional calls, add one of the SetHL_BTN DVD command
authorSteve Lhomme <robux@videolan.org>
Tue, 17 May 2005 21:27:03 +0000 (21:27 +0000)
committerSteve Lhomme <robux@videolan.org>
Tue, 17 May 2005 21:27:03 +0000 (21:27 +0000)
modules/demux/mkv.cpp

index d9048e23d7fc384a421d44e86a3a13a52646ac2e..f7394c331e1d3cf38580dd80f23eee37617d554c 100644 (file)
@@ -774,14 +774,15 @@ protected:
     // DVD command IDs
 
     // Tests
-    // wether the test has to be positive or not
-    static const uint16 CMD_DVD_IF_NOT              = 0x10;
     // wether it's a comparison on the value or register
     static const uint16 CMD_DVD_TEST_VALUE          = 0x80;
-    static const uint16 CMD_DVD_IF_GPREG_AND        = (0 << 5);
-    static const uint16 CMD_DVD_IF_GPREG_EQUAL      = (1 << 5);
-    static const uint16 CMD_DVD_IF_GPREG_SUP_EQUAL  = (2 << 5);
-    static const uint16 CMD_DVD_IF_GPREG_INF        = (3 << 5);
+    static const uint16 CMD_DVD_IF_GPREG_AND        = (1 << 4);
+    static const uint16 CMD_DVD_IF_GPREG_EQUAL      = (2 << 4);
+    static const uint16 CMD_DVD_IF_GPREG_NOT_EQUAL  = (3 << 4);
+    static const uint16 CMD_DVD_IF_GPREG_SUP_EQUAL  = (4 << 4);
+    static const uint16 CMD_DVD_IF_GPREG_SUP        = (5 << 4);
+    static const uint16 CMD_DVD_IF_GPREG_INF_EQUAL  = (6 << 4);
+    static const uint16 CMD_DVD_IF_GPREG_INF        = (7 << 4);
     
     static const uint16 CMD_DVD_NOP                    = 0x0000;
     static const uint16 CMD_DVD_GOTO_LINE              = 0x0001;
@@ -5517,48 +5518,81 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
     // handle register tests if there are some
     if ( (i_command & 0xF0) != 0 )
     {
-        bool b_test_positive = (i_command & CMD_DVD_IF_NOT) == 0;
+        bool b_test_positive = true;//(i_command & CMD_DVD_IF_NOT) == 0;
         bool b_test_value    = (i_command & CMD_DVD_TEST_VALUE) != 0;
         uint8 i_test = i_command & 0x70;
         uint16 i_value;
 
+        // see http://dvd.sourceforge.net/dvdinfo/vmi.html
+        uint8  i_cr1;
+        uint16 i_cr2;
+        switch ( i_command >> 12 )
+        {
+        case 0:
+        case 1:
+        case 2:
+            i_cr1 = p_command[3];
+            i_cr2 = (p_command[4] << 8) + p_command[5];
+            break;
+        case 3:
+        case 4:
+        case 5:
+            i_cr1 = p_command[6];
+            i_cr2 = p_command[7];
+            b_test_value = false;
+            break;
+        case 6:
+        case 7:
+            if ( ((p_command[1] >> 4) & 0x7) == 0)
+            {
+                i_cr1 = p_command[2];
+                i_cr2 = (p_command[6] << 8) + p_command[7];
+            }
+            else
+            {
+                i_cr1 = p_command[2];
+                i_cr2 = (p_command[6] << 8) + p_command[7];
+            }
+            break;
+        }
+
         if ( b_test_value )
-            i_value = ( p_command[4] << 8 ) + p_command[5];
+            i_value = i_cr2;
         else
-            i_value = GetPRM( p_command[7] );
+            i_value = GetPRM( i_cr2 );
 
         switch ( i_test )
         {
         case CMD_DVD_IF_GPREG_EQUAL:
             // if equals
-            msg_Dbg( &sys.demuxer, "IF %s EQUALS %s", GetRegTypeName( false, p_command[3] ).c_str(), GetRegTypeName( b_test_value, i_value ).c_str() );
-            if (!( GetPRM( p_command[3] ) == i_value ))
+            msg_Dbg( &sys.demuxer, "IF %s EQUALS %s", GetRegTypeName( false, i_cr1 ).c_str(), GetRegTypeName( b_test_value, i_value ).c_str() );
+            if (!( GetPRM( i_cr1 ) == i_value ))
             {
-                b_test_positive = !b_test_positive;
+                b_test_positive = false;
             }
             break;
         case CMD_DVD_IF_GPREG_INF:
             // if inferior
             msg_Dbg( &sys.demuxer, "IF %s < %s", GetRegTypeName( false, p_command[3] ).c_str(), GetRegTypeName( b_test_value, i_value ).c_str() );
-            if (!( GetPRM( p_command[3] ) < i_value ))
+            if (!( GetPRM( i_cr1 ) < i_value ))
             {
-                b_test_positive = !b_test_positive;
+                b_test_positive = false;
             }
             break;
         case CMD_DVD_IF_GPREG_AND:
             // if logical and
             msg_Dbg( &sys.demuxer, "IF %s & %s", GetRegTypeName( false, p_command[3] ).c_str(), GetRegTypeName( b_test_value, i_value ).c_str() );
-            if (!( GetPRM( p_command[3] ) & i_value ))
+            if (!( GetPRM( i_cr1 ) & i_value ))
             {
-                b_test_positive = !b_test_positive;
+                b_test_positive = false;
             }
             break;
         case CMD_DVD_IF_GPREG_SUP_EQUAL:
             // if superior or equal
             msg_Dbg( &sys.demuxer, "IF %s >= %s", GetRegTypeName( false, p_command[3] ).c_str(), GetRegTypeName( b_test_value, i_value ).c_str() );
-            if (!( GetPRM( p_command[3] ) >= i_value ))
+            if (!( GetPRM( i_cr1 ) >= i_value ))
             {
-                b_test_positive = !b_test_positive;
+                b_test_positive = false;
             }
             break;
         }
@@ -5844,6 +5878,12 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
             // TODO
             break;
         }
+    case CMD_DVD_SET_HL_BTNN1:
+        {
+            msg_Dbg( &sys.demuxer, "SetHL_BTN (%d)", p_command[4] );
+            SetSPRM( 0x88, p_command[4] );
+            break;
+        }
     default:
         {
             msg_Dbg( &sys.demuxer, "unsupported command : %02X %02X %02X %02X %02X %02X %02X %02X"