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/stream.c | |
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/stream.c')
-rw-r--r-- | libhb/stream.c | 87 |
1 files changed, 67 insertions, 20 deletions
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]; |