OSDN Git Service

preserve vobsub palette, width, and height from mkv and mp4 vobsub tracks
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sun, 30 May 2010 18:15:03 +0000 (18:15 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sun, 30 May 2010 18:15:03 +0000 (18:15 +0000)
Thanks to davidfster for mp4 palette addition.

git-svn-id: svn://localhost/HandBrake/trunk@3337 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.h
libhb/muxmkv.c
libhb/muxmp4.c
libhb/scan.c
libhb/stream.c

index 204cfdb..0f97419 100644 (file)
@@ -512,6 +512,8 @@ struct hb_subtitle_s
     // Color lookup table for VOB subtitle tracks. Each entry is in YCbCr format.
     // Must be filled out by the demuxer for VOB subtitle tracks.
     uint32_t    palette[16];
+    int         width;
+    int         height;
 
     int hits;     /* How many hits/occurrences of this subtitle */
     int forced_hits; /* How many forced hits in this subtitle */
index 8fcd30b..aa320e9 100644 (file)
@@ -277,7 +277,7 @@ static int MKVInit( hb_mux_object_t * m )
                 for (j = 0; j < 16; j++)
                     rgb[j] = hb_yuv2rgb(subtitle->palette[j]);
                 len = snprintf(subidx, 2048, subidx_fmt, 
-                        title->width, title->height,
+                        subtitle->width, subtitle->height,
                         0, 0, "OFF",
                         rgb[0], rgb[1], rgb[2], rgb[3],
                         rgb[4], rgb[5], rgb[6], rgb[7],
index 3c878fd..bc523f8 100644 (file)
@@ -528,7 +528,7 @@ static int MP4Init( hb_mux_object_t * m )
             mux_data->subtitle = 1;
             mux_data->sub_format = subtitle->format;
 
-            mux_data->track = MP4AddSubpicTrack( m->file, 90000, title->width, title->height );
+            mux_data->track = MP4AddSubpicTrack( m->file, 90000, subtitle->width, subtitle->height );
 
             MP4SetTrackLanguage(m->file, mux_data->track, subtitle->iso639_2);
 
index a45829b..68188a2 100644 (file)
@@ -173,6 +173,22 @@ static void ScanFunc( void * _data )
             j++;
         }
 
+        if ( data->dvd )
+        {
+            // The subtitle width and height needs to be set to the 
+            // title widht and height for DVDs.  title width and
+            // height don't get set until we decode previews, so
+            // we can't set subtitle width/height till we get here.
+            for( j = 0; j < hb_list_count( title->list_subtitle ); j++ )
+            {
+                hb_subtitle_t *subtitle = hb_list_item( title->list_subtitle, j );
+                if ( subtitle->source == VOBSUB )
+                {
+                    subtitle->width = title->width;
+                    subtitle->height = title->height;
+                }
+            }
+        }
         i++;
     }
 
index 95bf719..f4f5ae3 100644 (file)
@@ -2832,9 +2832,6 @@ static void add_ffmpeg_audio( hb_title_t *title, hb_stream_t *stream, int id )
 }
 
 /*
- * Parses the 'subtitle->palette' information from the specific VOB subtitle track's private data.
- * Returns 0 if successful or 1 if parsing failed or was incomplete.
- * 
  * Format:
  *   MkvVobSubtitlePrivateData = ( Line )*
  *   Line = FieldName ':' ' ' FieldValue '\n'
@@ -2847,11 +2844,8 @@ static void add_ffmpeg_audio( hb_title_t *title, hb_stream_t *stream, int id )
  * More information on the format at:
  *   http://www.matroska.org/technical/specs/subtitles/images.html
  */
-static int ffmpeg_parse_vobsub_extradata( AVCodecContext *codec, hb_subtitle_t *subtitle )
+static int ffmpeg_parse_vobsub_extradata_mkv( AVCodecContext *codec, hb_subtitle_t *subtitle )
 {
-    if ( codec->extradata_size <= 0 )
-        return 1;
-    
     // lines = (string) codec->extradata;
     char *lines = malloc( codec->extradata_size + 1 );
     if ( lines == NULL )
@@ -2861,26 +2855,46 @@ static int ffmpeg_parse_vobsub_extradata( AVCodecContext *codec, hb_subtitle_t *
     
     uint32_t rgb[16];
     int gotPalette = 0;
+    int gotDimensions = 0;
     
     char *curLine, *curLine_parserData;
     for ( curLine = strtok_r( lines, "\n", &curLine_parserData );
           curLine;
           curLine = strtok_r( NULL, "\n", &curLine_parserData ) )
     {
-        int numElementsRead = sscanf(curLine, "palette: "
-            "%06x, %06x, %06x, %06x, "
-            "%06x, %06x, %06x, %06x, "
-            "%06x, %06x, %06x, %06x, "
-            "%06x, %06x, %06x, %06x",
-            &rgb[0],  &rgb[1],  &rgb[2],  &rgb[3],
-            &rgb[4],  &rgb[5],  &rgb[6],  &rgb[7],
-            &rgb[8],  &rgb[9],  &rgb[10], &rgb[11],
-            &rgb[12], &rgb[13], &rgb[14], &rgb[15]);
-        
-        if (numElementsRead == 16) {
-            gotPalette = 1;
-            break;
+        if (!gotPalette)
+        {
+            int numElementsRead = sscanf(curLine, "palette: "
+                "%06x, %06x, %06x, %06x, "
+                "%06x, %06x, %06x, %06x, "
+                "%06x, %06x, %06x, %06x, "
+                "%06x, %06x, %06x, %06x",
+                &rgb[0],  &rgb[1],  &rgb[2],  &rgb[3],
+                &rgb[4],  &rgb[5],  &rgb[6],  &rgb[7],
+                &rgb[8],  &rgb[9],  &rgb[10], &rgb[11],
+                &rgb[12], &rgb[13], &rgb[14], &rgb[15]);
+
+            if (numElementsRead == 16) {
+                gotPalette = 1;
+            }
         }
+        if (!gotDimensions)
+        {
+            int numElementsRead = sscanf(curLine, "size: %dx%d",
+                &subtitle->width, &subtitle->height);
+
+            if (numElementsRead == 2) {
+                gotDimensions = 1;
+            }
+        }
+        if (gotPalette && gotDimensions)
+            break;
+    }
+
+    if (subtitle->width == 0 || subtitle->height == 0)
+    {
+        subtitle->width = 720;
+        subtitle->height = 480;
     }
     
     free( lines );
@@ -2898,6 +2912,39 @@ static int ffmpeg_parse_vobsub_extradata( AVCodecContext *codec, hb_subtitle_t *
     }
 }
 
+/*
+ * Format: 8-bit {0,Y,Cb,Cr} x 16
+ */
+static int ffmpeg_parse_vobsub_extradata_mp4( AVCodecContext *codec, hb_subtitle_t *subtitle )
+{
+    if ( codec->extradata_size != 4*16 )
+        return 1;
+    
+    int i, j;
+    for ( i=0, j=0; i<16; i++, j+=4 )
+    {
+        subtitle->palette[i] = 
+            codec->extradata[j+1] << 16 |   // Y
+            codec->extradata[j+2] << 8  |   // Cb
+            codec->extradata[j+3] << 0;     // Cr
+    }
+    subtitle->width = codec->width;
+    subtitle->height = codec->height;
+    return 0;
+}
+
+/*
+ * Parses the 'subtitle->palette' information from the specific VOB subtitle track's private data.
+ * Returns 0 if successful or 1 if parsing failed or was incomplete.
+ */
+static int ffmpeg_parse_vobsub_extradata( AVCodecContext *codec, hb_subtitle_t *subtitle )
+{
+    // XXX: Better if we actually chose the correct parser based on the input container
+    return
+        ffmpeg_parse_vobsub_extradata_mkv( codec, subtitle ) &&
+        ffmpeg_parse_vobsub_extradata_mp4( codec, subtitle );
+}
+
 static void add_ffmpeg_subtitle( hb_title_t *title, hb_stream_t *stream, int id )
 {
     AVStream *st = stream->ffmpeg_ic->streams[id];