summaryrefslogtreecommitdiffstats
path: root/libhb
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2010-05-30 18:15:03 +0000
committerjstebbins <[email protected]>2010-05-30 18:15:03 +0000
commit6c2ab0ec0cef0c3f6cc2771ad28a3d86b8df61e0 (patch)
treebf0d6931b501b89b805bdd967778f7009b189a38 /libhb
parent4e02d96c397f8912bda8ca975ffc398ccec77ca1 (diff)
preserve vobsub palette, width, and height from mkv and mp4 vobsub tracks
Thanks to davidfster for mp4 palette addition. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3337 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r--libhb/common.h2
-rw-r--r--libhb/muxmkv.c2
-rw-r--r--libhb/muxmp4.c2
-rw-r--r--libhb/scan.c16
-rw-r--r--libhb/stream.c87
5 files changed, 87 insertions, 22 deletions
diff --git a/libhb/common.h b/libhb/common.h
index 204cfdb92..0f9741924 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -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 */
diff --git a/libhb/muxmkv.c b/libhb/muxmkv.c
index 8fcd30b82..aa320e9aa 100644
--- a/libhb/muxmkv.c
+++ b/libhb/muxmkv.c
@@ -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],
diff --git a/libhb/muxmp4.c b/libhb/muxmp4.c
index 3c878fdfc..bc523f836 100644
--- a/libhb/muxmp4.c
+++ b/libhb/muxmp4.c
@@ -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);
diff --git a/libhb/scan.c b/libhb/scan.c
index a45829b15..68188a253 100644
--- a/libhb/scan.c
+++ b/libhb/scan.c
@@ -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++;
}
diff --git a/libhb/stream.c b/libhb/stream.c
index 95bf719ec..f4f5ae3fa 100644
--- a/libhb/stream.c
+++ b/libhb/stream.c
@@ -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];