Commit a1fbc870 authored by John Stebbins's avatar John Stebbins Committed by Laurent Aimar

vobsub idx parsing in matroska tracks

 Added capability to avformat and mkv demuxers to extract the
original_frame_width, original_frame_height and palette from their tracks
private data.
 Vobsubs in mkv were only using default values for these items.
Signed-off-by: default avatarLaurent Aimar <fenrir@videolan.org>
parent b6b78047
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "../../codec/avcodec/avcodec.h" #include "../../codec/avcodec/avcodec.h"
#include "avformat.h" #include "avformat.h"
#include "../vobsub.h"
//#define AVFORMAT_DEBUG 1 //#define AVFORMAT_DEBUG 1
...@@ -271,6 +272,48 @@ int OpenDemux( vlc_object_t *p_this ) ...@@ -271,6 +272,48 @@ int OpenDemux( vlc_object_t *p_this )
case CODEC_TYPE_SUBTITLE: case CODEC_TYPE_SUBTITLE:
es_format_Init( &fmt, SPU_ES, fcc ); es_format_Init( &fmt, SPU_ES, fcc );
if( strncmp( p_sys->ic->iformat->name, "matroska", 8 ) == 0 &&
cc->codec_id == CODEC_ID_DVD_SUBTITLE &&
cc->extradata != NULL &&
cc->extradata_size > 0 )
{
char *psz_start;
char *psz_buf = malloc( cc->extradata_size + 1);
if( psz_buf != NULL )
{
memcpy( psz_buf, cc->extradata , cc->extradata_size );
psz_buf[cc->extradata_size] = '\0';
psz_start = strstr( psz_buf, "size:" );
if( psz_start &&
vobsub_size_parse( psz_start,
&fmt.subs.spu.i_original_frame_width,
&fmt.subs.spu.i_original_frame_height ) == VLC_SUCCESS )
{
msg_Dbg( p_demux, "original frame size: %dx%d",
fmt.subs.spu.i_original_frame_width,
fmt.subs.spu.i_original_frame_height );
}
else
{
msg_Warn( p_demux, "reading original frame size failed" );
}
psz_start = strstr( psz_buf, "palette:" );
if( psz_start &&
vobsub_palette_parse( psz_start, &fmt.subs.spu.palette[1] ) == VLC_SUCCESS )
{
fmt.subs.spu.palette[0] = 0xBeef;
msg_Dbg( p_demux, "vobsub palette read" );
}
else
{
msg_Warn( p_demux, "reading original palette failed" );
}
free( psz_buf );
}
}
psz_type = "subtitle"; psz_type = "subtitle";
break; break;
......
...@@ -28,6 +28,10 @@ ...@@ -28,6 +28,10 @@
#include "demux.hpp" #include "demux.hpp"
extern "C" {
#include "../vobsub.h"
}
/* GetFourCC helper */ /* GetFourCC helper */
#define GetFOURCC( p ) __GetFOURCC( (uint8_t*)p ) #define GetFOURCC( p ) __GetFOURCC( (uint8_t*)p )
static vlc_fourcc_t __GetFOURCC( uint8_t *p ) static vlc_fourcc_t __GetFOURCC( uint8_t *p )
...@@ -1095,22 +1099,41 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) ...@@ -1095,22 +1099,41 @@ bool matroska_segment_c::Select( mtime_t i_start_time )
tracks[i_track]->fmt.i_codec = VLC_CODEC_SPU; tracks[i_track]->fmt.i_codec = VLC_CODEC_SPU;
if( tracks[i_track]->i_extra_data ) if( tracks[i_track]->i_extra_data )
{ {
char *p_start; char *psz_start;
char *p_buf = (char *)malloc( tracks[i_track]->i_extra_data + 1); char *psz_buf = (char *)malloc( tracks[i_track]->i_extra_data + 1);
memcpy( p_buf, tracks[i_track]->p_extra_data , tracks[i_track]->i_extra_data ); if( psz_buf != NULL )
p_buf[tracks[i_track]->i_extra_data] = '\0';
p_start = strstr( p_buf, "size:" );
if( sscanf( p_start, "size: %dx%d",
&tracks[i_track]->fmt.subs.spu.i_original_frame_width, &tracks[i_track]->fmt.subs.spu.i_original_frame_height ) == 2 )
{ {
msg_Dbg( &sys.demuxer, "original frame size vobsubs: %dx%d", tracks[i_track]->fmt.subs.spu.i_original_frame_width, tracks[i_track]->fmt.subs.spu.i_original_frame_height ); memcpy( psz_buf, tracks[i_track]->p_extra_data , tracks[i_track]->i_extra_data );
} psz_buf[tracks[i_track]->i_extra_data] = '\0';
else
{ psz_start = strstr( psz_buf, "size:" );
msg_Warn( &sys.demuxer, "reading original frame size for vobsub failed" ); if( psz_start &&
vobsub_size_parse( psz_start,
&tracks[i_track]->fmt.subs.spu.i_original_frame_width,
&tracks[i_track]->fmt.subs.spu.i_original_frame_height ) == VLC_SUCCESS )
{
msg_Dbg( &sys.demuxer, "original frame size vobsubs: %dx%d",
tracks[i_track]->fmt.subs.spu.i_original_frame_width,
tracks[i_track]->fmt.subs.spu.i_original_frame_height );
}
else
{
msg_Warn( &sys.demuxer, "reading original frame size for vobsub failed" );
}
psz_start = strstr( psz_buf, "palette:" );
if( psz_start &&
vobsub_palette_parse( psz_start, &tracks[i_track]->fmt.subs.spu.palette[1] ) == VLC_SUCCESS )
{
tracks[i_track]->fmt.subs.spu.palette[0] = 0xBeef;
msg_Dbg( &sys.demuxer, "vobsub palette read" );
}
else
{
msg_Warn( &sys.demuxer, "reading original palette failed" );
}
free( psz_buf );
} }
free( p_buf );
} }
} }
else if( !strcmp( tracks[i_track]->psz_codec, "B_VOBBTN" ) ) else if( !strcmp( tracks[i_track]->psz_codec, "B_VOBBTN" ) )
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <vlc_charset.h> #include <vlc_charset.h>
#include "ps.h" #include "ps.h"
#include "vobsub.h"
#define MAX_LINE 8192 #define MAX_LINE 8192
...@@ -488,8 +489,8 @@ static int ParseVobSubIDX( demux_t *p_demux ) ...@@ -488,8 +489,8 @@ static int ParseVobSubIDX( demux_t *p_demux )
else if( !strncmp( "size:", line, 5 ) ) else if( !strncmp( "size:", line, 5 ) )
{ {
/* Store the original size of the video */ /* Store the original size of the video */
if( sscanf( line, "size: %dx%d", if( vobsub_size_parse( line, &p_sys->i_original_frame_width,
&p_sys->i_original_frame_width, &p_sys->i_original_frame_height ) == 2 ) &p_sys->i_original_frame_height ) == VLC_SUCCESS )
{ {
msg_Dbg( p_demux, "original frame size: %dx%d", p_sys->i_original_frame_width, p_sys->i_original_frame_height ); msg_Dbg( p_demux, "original frame size: %dx%d", p_sys->i_original_frame_width, p_sys->i_original_frame_height );
} }
...@@ -500,33 +501,8 @@ static int ParseVobSubIDX( demux_t *p_demux ) ...@@ -500,33 +501,8 @@ static int ParseVobSubIDX( demux_t *p_demux )
} }
else if( !strncmp( "palette:", line, 8 ) ) else if( !strncmp( "palette:", line, 8 ) )
{ {
int i; if( vobsub_palette_parse( line, p_sys->palette ) == VLC_SUCCESS )
/* Store the palette of the subs */
if( sscanf( line, "palette: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x",
&p_sys->palette[0], &p_sys->palette[1], &p_sys->palette[2], &p_sys->palette[3],
&p_sys->palette[4], &p_sys->palette[5], &p_sys->palette[6], &p_sys->palette[7],
&p_sys->palette[8], &p_sys->palette[9], &p_sys->palette[10], &p_sys->palette[11],
&p_sys->palette[12], &p_sys->palette[13], &p_sys->palette[14], &p_sys->palette[15] ) == 16 )
{ {
for( i = 0; i < 16; i++ )
{
uint8_t r = 0, g = 0, b = 0;
uint8_t y = 0, u = 0, v = 0;
r = (p_sys->palette[i] >> 16) & 0xff;
g = (p_sys->palette[i] >> 8) & 0xff;
b = (p_sys->palette[i] >> 0) & 0xff;
/* msg_Dbg( p_demux, "palette %d: R=%x, G=%x, B=%x", i, r, g, b ); */
y = (uint8_t) __MIN(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235);
u = (uint8_t) __MIN(abs(r * -1214 + g * -2384 + b * 3598 + 4096 + 1048576) >> 13, 240);
v = (uint8_t) __MIN(abs(r * 3598 + g * -3013 + b * -585 + 4096 + 1048576) >> 13, 240);
p_sys->palette[i] = 0;
p_sys->palette[i] |= (y&0xff)<<16;
p_sys->palette[i] |= (u&0xff);
p_sys->palette[i] |= (v&0xff)<<8;
/* msg_Dbg( p_demux, "palette %d: y=%x, u=%x, v=%x", i, y, u, v ); */
}
p_sys->b_palette = true; p_sys->b_palette = true;
msg_Dbg( p_demux, "vobsub palette read" ); msg_Dbg( p_demux, "vobsub palette read" );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment