From 97293969b40797442ec0f612b89a89ace8804561 Mon Sep 17 00:00:00 2001 From: aurel Date: Mon, 27 Oct 2008 22:51:22 +0000 Subject: [PATCH] Factorize vobsub idx/extradata handling. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27841 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_mkv.c | 208 ----------------------------------------- libmpdemux/stheader.h | 6 -- mencoder.c | 7 +- mplayer.c | 35 +------ spudec.c | 86 ++++++++++++----- spudec.h | 3 +- vobsub.c | 155 +++--------------------------- vobsub.h | 1 - 8 files changed, 81 insertions(+), 420 deletions(-) diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 3e667d2534..b63f466e86 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -255,123 +255,6 @@ aac_get_sample_rate_index (uint32_t sample_rate) return 11; } - -static int -vobsub_parse_size (sh_sub_t *sh, const char *start) -{ - if (sscanf(&start[6], "%dx%d", &sh->width, &sh->height) == 2) - { - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub size: %ux%u\n", - sh->width, sh->height); - return 1; - } - return 0; -} - -static int -vobsub_parse_palette (sh_sub_t *sh, const char *start) -{ - int i; - - start += 8; - while (isspace(*start)) - start++; - for (i = 0; i < 16; i++) - { - unsigned int tmp; - if (sscanf(start, "%06x", &tmp) != 1) - break; - sh->palette[i] = vobsub_palette_to_yuv(tmp); - start += 6; - while ((*start == ',') || isspace(*start)) - start++; - } - if (i == 16) - { - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub palette: %06x,%06x," - "%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x," - "%06x,%06x,%06x\n", sh->palette[0], - sh->palette[1], sh->palette[2], - sh->palette[3], sh->palette[4], - sh->palette[5], sh->palette[6], - sh->palette[7], sh->palette[8], - sh->palette[9], sh->palette[10], - sh->palette[11], sh->palette[12], - sh->palette[13], sh->palette[14], - sh->palette[15]); - sh->has_palette = 1; - return 2; - } - return 0; -} - -static int -vobsub_parse_custom_colors (sh_sub_t *sh, const char *start) -{ - int use_custom_colors, i; - const char *p; - unsigned int tridx = 0; - - use_custom_colors = 0; - start += 14; - while (isspace(*start)) - start++; - if (!strncasecmp(start, "ON", 2) || (*start == '1')) - use_custom_colors = 1; - else if (!strncasecmp(start, "OFF", 3) || (*start == '0')) - use_custom_colors = 0; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub custom colors: %s\n", - use_custom_colors ? "ON" : "OFF"); - if ((p = strstr(start, "tridx:")) != NULL) - tridx = strtoul(p + 6, NULL, 2); - if ((start = strstr(start, "colors:")) != NULL) - { - start += 7; - while (isspace(*start)) - start++; - for (i = 0; i < 4; i++) - { - unsigned int tmp; - if (sscanf(start, "%06x", &tmp) != 1) - break; - sh->colors[i] = vobsub_rgb_to_yuv(tmp); - if ((tridx << i) & 0x08) - sh->colors[i] |= 1 << 31; - start += 6; - while ((*start == ',') || isspace(*start)) - start++; - } - if (i == 4) - { - sh->custom_colors = 4; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub colors: %08x," - "%08x,%08x,%08x\n", sh->colors[0], - sh->colors[1], sh->colors[2], - sh->colors[3]); - } - } - if (!use_custom_colors) - sh->custom_colors = 0; - return 4; -} - -static int -vobsub_parse_forced_subs (sh_sub_t *sh, const char *start) -{ - start += 12; - while (isspace(*start)) - start++; - if (!strncasecmp(start, "on", 2) || (*start == '1')) - sh->forced_subs_only = 1; - else if (!strncasecmp(start, "off", 3) || (*start == '0')) - sh->forced_subs_only = 0; - else - return 0; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub forced subs: %d\n", - sh->forced_subs_only); - return 8; -} - /** \brief Free cached demux packets * * Reordering the timecodes requires caching of demux packets. This function @@ -400,63 +283,6 @@ free_cached_dps (demuxer_t *demuxer) } } -static int -demux_mkv_parse_idx (mkv_track_t *t) -{ - int things_found, last; - char *buf, *pos, *start; - - if ((t->private_data == NULL) || (t->private_size == 0)) - return 0; - - things_found = 0; - buf = malloc(t->private_size + 1); - if (buf == NULL) - return 0; - memcpy(buf, t->private_data, t->private_size); - buf[t->private_size] = 0; - t->sh_sub->has_palette = 0; - - pos = buf; - start = buf; - last = 0; - do - { - if ((*pos == 0) || (*pos == '\r') || (*pos == '\n')) - { - if (*pos == 0) - last = 1; - *pos = 0; - - if (!strncasecmp(start, "size: ", 6)) - things_found |= vobsub_parse_size(t->sh_sub, start); - else if (!strncasecmp(start, "palette:", 8)) - things_found |= vobsub_parse_palette(t->sh_sub, start); - else if (!strncasecmp(start, "custom colors:", 14)) - things_found |= vobsub_parse_custom_colors(t->sh_sub, start); - else if (!strncasecmp(start, "forced subs:", 12)) - things_found |= vobsub_parse_forced_subs(t->sh_sub, start); - - if (last) - break; - do - { - pos++; - } - while ((*pos == '\r') || (*pos == '\n')); - start = pos; - } - else - pos++; - } - while (!last && (*start != 0)); - - free(buf); - - return (things_found & 3) == 3; -} - - static int demux_mkv_decode (mkv_track_t *track, uint8_t *src, uint8_t **dest, uint32_t *size, uint32_t type) @@ -2159,38 +1985,6 @@ demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid) return 0; } -/** \brief Parse the private data for VobSub subtitle tracks. - - This function tries to parse the private data for all VobSub tracks. - The private data contains the normal text from the original .idx file. - Things like the palette, subtitle dimensions and custom colors are - stored here. - - \param demuxer The generic demuxer. -*/ -static void -demux_mkv_parse_vobsub_data (demuxer_t *demuxer) -{ - mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; - mkv_track_t *track; - int i; - - for (i = 0; i < mkv_d->num_tracks; i++) - { - track = mkv_d->tracks[i]; - if ((track->type != MATROSKA_TRACK_SUBTITLE) || - (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB)) - continue; - - if (!demux_mkv_parse_idx (track)) - { - free (track->private_data); - track->private_data = NULL; - track->private_size = 0; - } - } -} - static int demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid) { @@ -2427,8 +2221,6 @@ demux_mkv_open (demuxer_t *demuxer) } } - demux_mkv_parse_vobsub_data (demuxer); - if (demuxer->chapters) { for (i=0; i < (int)demuxer->num_chapters; i++) diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h index 4f2266be8b..07ecfaeded 100644 --- a/libmpdemux/stheader.h +++ b/libmpdemux/stheader.h @@ -97,12 +97,6 @@ typedef struct { typedef struct { int sid; char type; // t = text, v = VobSub, a = SSA/ASS - int has_palette; // If we have a valid palette - unsigned int palette[16]; // for VobSubs - int width, height; // for VobSubs - int custom_colors; - unsigned int colors[4]; - int forced_subs_only; unsigned char* extradata; // extra header data passed from demuxer int extradata_len; #ifdef CONFIG_ASS diff --git a/mencoder.c b/mencoder.c index bc378673f2..f0105fe421 100644 --- a/mencoder.c +++ b/mencoder.c @@ -738,19 +738,16 @@ else { if (spudec_ifo) { unsigned int palette[16], width, height; if (vobsub_parse_ifo(NULL,spudec_ifo, palette, &width, &height, 1, -1, NULL) >= 0) - vo_spudec=spudec_new_scaled(palette, sh_video->disp_w, sh_video->disp_h); + vo_spudec=spudec_new_scaled(palette, sh_video->disp_w, sh_video->disp_h, NULL, 0); } #ifdef CONFIG_DVDREAD if (vo_spudec==NULL) { vo_spudec=spudec_new_scaled(stream->type==STREAMTYPE_DVD?((dvd_priv_t *)(stream->priv))->cur_pgc->palette:NULL, - sh_video->disp_w, sh_video->disp_h); + sh_video->disp_w, sh_video->disp_h, NULL, 0); } #endif } -// Apply current settings for forced subs -spudec_set_forced_subs_only(vo_spudec,forced_subs_only); - ostream = open_output_stream(out_filename, 0); if(!ostream) { mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CannotOpenOutputFile, out_filename); diff --git a/mplayer.c b/mplayer.c index 5b43185746..9129ee871b 100644 --- a/mplayer.c +++ b/mplayer.c @@ -1088,14 +1088,15 @@ void init_vo_spudec(void) { unsigned int palette[16], width, height; current_module="spudec_init_vobsub"; if (vobsub_parse_ifo(NULL,spudec_ifo, palette, &width, &height, 1, -1, NULL) >= 0) - vo_spudec=spudec_new_scaled(palette, width, height); + vo_spudec=spudec_new_scaled(palette, width, height, NULL, 0); } #ifdef CONFIG_DVDREAD if (vo_spudec==NULL && mpctx->stream->type==STREAMTYPE_DVD) { current_module="spudec_init_dvdread"; vo_spudec=spudec_new_scaled(((dvd_priv_t *)(mpctx->stream->priv))->cur_pgc->palette, - mpctx->sh_video->disp_w, mpctx->sh_video->disp_h); + mpctx->sh_video->disp_w, mpctx->sh_video->disp_h, + NULL, 0); } #endif @@ -1103,34 +1104,14 @@ void init_vo_spudec(void) { if (vo_spudec==NULL && mpctx->stream->type==STREAMTYPE_DVDNAV) { unsigned int *palette = mp_dvdnav_get_spu_clut(mpctx->stream); current_module="spudec_init_dvdnav"; - vo_spudec=spudec_new_scaled(palette, mpctx->sh_video->disp_w, mpctx->sh_video->disp_h); + vo_spudec=spudec_new_scaled(palette, mpctx->sh_video->disp_w, mpctx->sh_video->disp_h, NULL, 0); } #endif - if ((vo_spudec == NULL) && (mpctx->demuxer->type == DEMUXER_TYPE_MATROSKA) && - (mpctx->d_sub->sh != NULL) && (((sh_sub_t *)mpctx->d_sub->sh)->type == 'v')) { - sh_sub_t *mkv_sh_sub = (sh_sub_t *)mpctx->d_sub->sh; - current_module = "spudec_init_matroska"; - vo_spudec = - spudec_new_scaled_vobsub(mkv_sh_sub->palette, mkv_sh_sub->colors, - mkv_sh_sub->custom_colors, mkv_sh_sub->width, - mkv_sh_sub->height); - forced_subs_only = mkv_sh_sub->forced_subs_only; - } - if (vo_spudec==NULL) { sh_sub_t *sh = (sh_sub_t *)mpctx->d_sub->sh; - unsigned int *palette = NULL; - if (sh && !sh->has_palette && sh->extradata_len == 16*4) { - int i; - for (i = 0; i < 16; i++) - sh->palette[i] = AV_RB32(sh->extradata + i*4); - sh->has_palette = 1; - } - if (sh && sh->has_palette) - palette = sh->palette; current_module="spudec_init_normal"; - vo_spudec=spudec_new_scaled(palette, mpctx->sh_video->disp_w, mpctx->sh_video->disp_h); + vo_spudec=spudec_new_scaled(NULL, mpctx->sh_video->disp_w, mpctx->sh_video->disp_h, sh->extradata, sh->extradata_len); spudec_set_font_factor(vo_spudec,font_factor); } @@ -3112,8 +3093,6 @@ if (edl_output_filename) { if(vo_vobsub){ initialized_flags|=INITIALIZED_VOBSUB; vobsub_set_from_lang(vo_vobsub, dvdsub_lang); - // check if vobsub requested only to display forced subtitles - forced_subs_only=vobsub_get_forced_subs_flag(vo_vobsub); // setup global sub numbering mpctx->global_sub_indices[SUB_SOURCE_VOBSUB] = mpctx->global_sub_size; // the global # of the first vobsub. @@ -3437,10 +3416,6 @@ if(vo_spudec==NULL && mpctx->sh_video && init_vo_spudec(); } -// Apply current settings for forced subs -if (vo_spudec!=NULL) - spudec_set_forced_subs_only(vo_spudec,forced_subs_only); - if(mpctx->sh_video) { // after reading video params we should load subtitles because // we know fps so now we can adjust subtitle time to ~6 seconds AST diff --git a/spudec.c b/spudec.c index 78aa3bb4fd..b06d9a0949 100644 --- a/spudec.c +++ b/spudec.c @@ -23,7 +23,9 @@ #include #include "libvo/video_out.h" #include "spudec.h" +#include "vobsub.h" #include "libavutil/avutil.h" +#include "libavutil/intreadwrite.h" #include "libswscale/swscale.h" /* Valid values for spu_aamode: @@ -1114,39 +1116,73 @@ void spudec_set_font_factor(void * this, double factor) spu->font_start_level = (int)(0xF0-(0xE0*factor)); } -void *spudec_new_scaled(unsigned int *palette, unsigned int frame_width, unsigned int frame_height) +static void spudec_parse_extradata(spudec_handle_t *this, + uint8_t *extradata, int extradata_len) { - return spudec_new_scaled_vobsub(palette, NULL, 0, frame_width, frame_height); + uint8_t *buffer, *ptr; + unsigned int *pal = this->global_palette, *cuspal = this->cuspal; + unsigned int tridx; + int i; + + if (extradata_len == 16*4) { + for (i=0; i<16; i++) + pal[i] = AV_RB32(extradata + i*4); + this->auto_palette = 0; + return; + } + + if (!(ptr = buffer = malloc(extradata_len+1))) + return; + memcpy(buffer, extradata, extradata_len); + buffer[extradata_len] = 0; + + do { + sscanf(ptr, "size: %dx%d", &this->orig_frame_width, &this->orig_frame_height); + if (sscanf(ptr, "palette: %x, %x, %x, %x, %x, %x, %x, %x," + " %x, %x, %x, %x, %x, %x, %x, %x", + &pal[ 0], &pal[ 1], &pal[ 2], &pal[ 3], + &pal[ 4], &pal[ 5], &pal[ 6], &pal[ 7], + &pal[ 8], &pal[ 9], &pal[10], &pal[11], + &pal[12], &pal[13], &pal[14], &pal[15]) == 16) { + for (i=0; i<16; i++) + pal[i] = vobsub_palette_to_yuv(pal[i]); + this->auto_palette = 0; + } + if (!strncasecmp(ptr, "forced subs: on", 15)) + this->forced_subs_only = 1; + if (sscanf(ptr, "custom colors: ON, tridx: %x, colors: %x, %x, %x, %x", + &tridx, cuspal+0, cuspal+1, cuspal+2, cuspal+3) == 5) { + for (i=0; i<4; i++) { + cuspal[i] = vobsub_rgb_to_yuv(cuspal[i]); + if (tridx & (1 << (12-4*i))) + cuspal[i] |= 1 << 31; + } + this->custom = 1; + } + } while ((ptr=strchr(ptr,'\n')) && *++ptr); + + free(buffer); } -/* get palette custom color, width, height from .idx file */ -void *spudec_new_scaled_vobsub(unsigned int *palette, unsigned int *cuspal, unsigned int custom, unsigned int frame_width, unsigned int frame_height) +void *spudec_new_scaled(unsigned int *palette, unsigned int frame_width, unsigned int frame_height, uint8_t *extradata, int extradata_len) { spudec_handle_t *this = calloc(1, sizeof(spudec_handle_t)); if (this){ - //(fprintf(stderr,"VobSub Custom Palette: %d,%d,%d,%d", this->cuspal[0], this->cuspal[1], this->cuspal[2],this->cuspal[3]); - this->packet = NULL; - this->image = NULL; - this->scaled_image = NULL; + this->orig_frame_height = frame_height; + // set up palette: + if (palette) + memcpy(this->global_palette, palette, sizeof(this->global_palette)); + else + this->auto_palette = 1; + if (extradata) + spudec_parse_extradata(this, extradata, extradata_len); /* XXX Although the video frame is some size, the SPU frame is always maximum size i.e. 720 wide and 576 or 480 high */ this->orig_frame_width = 720; - this->orig_frame_height = (frame_height == 480 || frame_height == 240) ? 480 : 576; - this->custom = custom; - // set up palette: - this->auto_palette = 1; - if (palette){ - memcpy(this->global_palette, palette, sizeof(this->global_palette)); - this->auto_palette = 0; - } - this->custom = custom; - if (custom && cuspal) { - memcpy(this->cuspal, cuspal, sizeof(this->cuspal)); - this->auto_palette = 0; - } - // forced subtitles default: show all subtitles - this->forced_subs_only=0; - this->is_forced_sub=0; + if (this->orig_frame_height == 480 || this->orig_frame_height == 240) + this->orig_frame_height = 480; + else + this->orig_frame_height = 576; } else mp_msg(MSGT_SPUDEC,MSGL_FATAL, "FATAL: spudec_init: calloc"); @@ -1155,7 +1191,7 @@ void *spudec_new_scaled_vobsub(unsigned int *palette, unsigned int *cuspal, unsi void *spudec_new(unsigned int *palette) { - return spudec_new_scaled(palette, 0, 0); + return spudec_new_scaled(palette, 0, 0, NULL, 0); } void spudec_free(void *this) diff --git a/spudec.h b/spudec.h index 5cdbec57d9..d4c794973b 100644 --- a/spudec.h +++ b/spudec.h @@ -8,8 +8,7 @@ void spudec_assemble(void *this, unsigned char *packet, unsigned int len, int pt void spudec_draw(void *this, void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)); void spudec_draw_scaled(void *this, unsigned int dxs, unsigned int dys, void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)); void spudec_update_palette(void *this, unsigned int *palette); -void *spudec_new_scaled(unsigned int *palette, unsigned int frame_width, unsigned int frame_height); -void *spudec_new_scaled_vobsub(unsigned int *palette, unsigned int *cuspal, unsigned int custom, unsigned int frame_width, unsigned int frame_height); +void *spudec_new_scaled(unsigned int *palette, unsigned int frame_width, unsigned int frame_height, uint8_t *extradata, int extradata_len); void *spudec_new(unsigned int *palette); void spudec_free(void *this); void spudec_reset(void *this); // called after seek diff --git a/vobsub.c b/vobsub.c index de19bbfc3b..6749ee4067 100644 --- a/vobsub.c +++ b/vobsub.c @@ -595,14 +595,13 @@ packet_queue_insert(packet_queue_t *queue) **********************************************************************/ typedef struct { + unsigned char *extradata; + unsigned int extradata_len; unsigned int palette[16]; - unsigned int cuspal[4]; int delay; - unsigned int custom; unsigned int have_palette; unsigned int orig_frame_width, orig_frame_height; unsigned int origin_x, origin_y; - unsigned int forced_subs; /* index */ packet_queue_t *spu_streams; unsigned int spu_streams_size; @@ -766,23 +765,6 @@ vobsub_parse_timestamp(vobsub_t *vob, const char *line) return vobsub_add_timestamp(vob, filepos, vob->delay + ms + 1000 * (s + 60 * (m + 60 * h))); } -static int -vobsub_parse_size(vobsub_t *vob, const char *line) -{ - // size: WWWxHHH - char *p; - while (isspace(*line)) - ++line; - if (!isdigit(*line)) - return -1; - vob->orig_frame_width = strtoul(line, &p, 10); - if (*p != 'x') - return -1; - ++p; - vob->orig_frame_height = strtoul(p, NULL, 10); - return 0; -} - static int vobsub_parse_origin(vobsub_t *vob, const char *line) { @@ -827,86 +809,6 @@ unsigned int vobsub_rgb_to_yuv(unsigned int rgb) return y << 16 | u << 8 | v; } -static int -vobsub_parse_palette(vobsub_t *vob, const char *line) -{ - // palette: XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX - unsigned int n; - n = 0; - while (1) { - const char *p; - int tmp; - while (isspace(*line)) - ++line; - p = line; - while (isxdigit(*p)) - ++p; - if (p - line != 6) - return -1; - tmp = strtoul(line, NULL, 16); - vob->palette[n++] = vobsub_palette_to_yuv(tmp); - if (n == 16) - break; - if (*p == ',') - ++p; - line = p; - } - vob->have_palette = 1; - return 0; -} - -static int -vobsub_parse_custom(vobsub_t *vob, const char *line) -{ - //custom colors: OFF/ON(0/1) - if ((strncmp("ON", line + 15, 2) == 0)||strncmp("1", line + 15, 1) == 0) - vob->custom=1; - else if ((strncmp("OFF", line + 15, 3) == 0)||strncmp("0", line + 15, 1) == 0) - vob->custom=0; - else - return -1; - return 0; -} - -static int -vobsub_parse_cuspal(vobsub_t *vob, const char *line) -{ - //colors: XXXXXX, XXXXXX, XXXXXX, XXXXXX - unsigned int n, tmp; - n = 0; - line += 40; - while(1){ - const char *p; - while (isspace(*line)) - ++line; - p=line; - while (isxdigit(*p)) - ++p; - if (p - line !=6) - return -1; - tmp = strtoul(line, NULL, 16); - vob->cuspal[n++] |= vobsub_rgb_to_yuv(tmp); - if (n==4) - break; - if(*p == ',') - ++p; - line = p; - } - return 0; -} - -static int -vobsub_parse_tridx(vobsub_t *vob, const char *line) -{ - //tridx: XXXX - int tridx, i; - tridx = strtoul((line + 26), NULL, 2); - for (i = 0; i < 4; ++i) - if ((tridx << i) & 0x08) - vob->cuspal[i] |= 1 << 31; - return tridx; -} - static int vobsub_parse_delay(vobsub_t *vob, const char *line) { @@ -941,26 +843,6 @@ vobsub_set_lang(const char *line) return 0; } -static int -vobsub_parse_forced_subs(vobsub_t *vob, const char *line) -{ - const char *p; - - p = line; - while (isspace(*p)) - ++p; - - if (strncasecmp("on",p,2) == 0){ - vob->forced_subs=~0; - return 0; - } else if (strncasecmp("off",p,3) == 0){ - vob->forced_subs=0; - return 0; - } - - return -1; -} - static int vobsub_parse_one_line(vobsub_t *vob, rar_stream_t *fd) { @@ -973,6 +855,12 @@ vobsub_parse_one_line(vobsub_t *vob, rar_stream_t *fd) if (line_size < 0) { break; } + + vob->extradata = realloc(vob->extradata, vob->extradata_len+line_size+1); + memcpy(vob->extradata+vob->extradata_len, line, line_size); + vob->extradata_len += line_size; + vob->extradata[vob->extradata_len] = 0; + if (*line == 0 || *line == '\r' || *line == '\n' || *line == '#') continue; else if (strncmp("langidx:", line, 8) == 0) @@ -981,19 +869,10 @@ vobsub_parse_one_line(vobsub_t *vob, rar_stream_t *fd) res = vobsub_parse_delay(vob, line); else if (strncmp("id:", line, 3) == 0) res = vobsub_parse_id(vob, line + 3); - else if (strncmp("palette:", line, 8) == 0) - res = vobsub_parse_palette(vob, line + 8); - else if (strncmp("size:", line, 5) == 0) - res = vobsub_parse_size(vob, line + 5); else if (strncmp("org:", line, 4) == 0) res = vobsub_parse_origin(vob, line + 4); else if (strncmp("timestamp:", line, 10) == 0) res = vobsub_parse_timestamp(vob, line + 10); - else if (strncmp("custom colors:", line, 14) == 0) - //custom colors: ON/OFF, tridx: XXXX, colors: XXXXXX, XXXXXX, XXXXXX,XXXXXX - res = vobsub_parse_cuspal(vob, line) + vobsub_parse_tridx(vob, line) + vobsub_parse_custom(vob, line); - else if (strncmp("forced subs:", line, 12) == 0) - res = vobsub_parse_forced_subs(vob, line + 12); else { mp_msg(MSGT_VOBSUB,MSGL_V, "vobsub: ignoring %s", line); continue; @@ -1115,11 +994,10 @@ vobsub_open(const char *const name,const char *const ifo,const int force,void** /* NOOP */ ; rar_close(fd); } - /* if no palette in .idx then use custom colors */ - if ((vob->custom == 0)&&(vob->have_palette!=1)) - vob->custom = 1; - if (spu && vob->orig_frame_width && vob->orig_frame_height) - *spu = spudec_new_scaled_vobsub(vob->palette, vob->cuspal, vob->custom, vob->orig_frame_width, vob->orig_frame_height); + if (spu) + *spu = spudec_new_scaled(vob->palette, vob->orig_frame_width, vob->orig_frame_height, vob->extradata, vob->extradata_len); + if (vob->extradata) + free(vob->extradata); /* read the indexed mpeg_stream */ strcpy(buf, name); @@ -1252,15 +1130,6 @@ int vobsub_get_index_by_id(void *vobhandle, int id) return j; } -unsigned int -vobsub_get_forced_subs_flag(void const * const vobhandle) -{ - if (vobhandle) - return ((vobsub_t*) vobhandle)->forced_subs; - else - return 0; -} - int vobsub_set_from_lang(void *vobhandle, unsigned char * lang) { diff --git a/vobsub.h b/vobsub.h index aa0ae865ec..1699ebdf70 100644 --- a/vobsub.h +++ b/vobsub.h @@ -24,7 +24,6 @@ extern void *vobsub_out_open(const char *basename, const unsigned int *palette, extern void vobsub_out_output(void *me, const unsigned char *packet, int len, double pts); extern void vobsub_out_close(void *me); extern int vobsub_set_from_lang(void *vobhandle, unsigned char * lang); -extern unsigned int vobsub_get_forced_subs_flag(void const * const vobhandle); extern void vobsub_seek(void * vobhandle, float pts); #endif /* MPLAYER_VOBSUB_H */