diff options
author | jstebbins <[email protected]> | 2010-05-30 18:15:03 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2010-05-30 18:15:03 +0000 |
commit | 6c2ab0ec0cef0c3f6cc2771ad28a3d86b8df61e0 (patch) | |
tree | bf0d6931b501b89b805bdd967778f7009b189a38 /libhb | |
parent | 4e02d96c397f8912bda8ca975ffc398ccec77ca1 (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.h | 2 | ||||
-rw-r--r-- | libhb/muxmkv.c | 2 | ||||
-rw-r--r-- | libhb/muxmp4.c | 2 | ||||
-rw-r--r-- | libhb/scan.c | 16 | ||||
-rw-r--r-- | libhb/stream.c | 87 |
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]; |