X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fspudec%2Fparse.c;h=99a8c4702da49bf03729cdd0f816849a52be61c3;hb=fdc455adc812cf9b02ae40c8bd47a1a261a32ce6;hp=9aad9d2f251e51cbbd4972e016fd6f020a8bb019;hpb=083927e378944e396e14fe5a5b3a8795f9360adb;p=vlc diff --git a/modules/codec/spudec/parse.c b/modules/codec/spudec/parse.c index 9aad9d2f25..99a8c4702d 100644 --- a/modules/codec/spudec/parse.c +++ b/modules/codec/spudec/parse.c @@ -31,7 +31,6 @@ #endif #include -#include #include #include @@ -102,7 +101,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) spu_properties_t spu_properties; /* Allocate the subpicture internal data. */ - p_spu = decoder_NewSubpicture( p_dec ); + p_spu = decoder_NewSubpicture( p_dec, NULL ); if( !p_spu ) return NULL; p_spu->i_original_picture_width = @@ -162,7 +161,7 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, decoder_sys_t *p_sys = p_dec->p_sys; /* Our current index in the SPU packet */ - unsigned int i_index = p_sys->i_rle_size + 4; + unsigned int i_index; /* The next start-of-control-sequence index and the previous one */ unsigned int i_next_seq = 0, i_cur_seq = 0; @@ -170,10 +169,27 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, /* Command and date */ uint8_t i_command = SPU_CMD_END; mtime_t date = 0; + bool b_cmd_offset = false; + bool b_cmd_alpha = false; + subpicture_data_t spu_data_cmd; if( !p_spu || !p_spu_data ) return VLC_EGENERIC; + /* Create working space for spu data */ + memset( &spu_data_cmd, 0, sizeof(spu_data_cmd) ); + spu_data_cmd.pi_offset[0] = -1; + spu_data_cmd.pi_offset[1] = -1; + spu_data_cmd.p_data = NULL; + spu_data_cmd.b_palette = false; + spu_data_cmd.b_auto_crop = false; + spu_data_cmd.i_y_top_offset = 0; + spu_data_cmd.i_y_bottom_offset = 0; + spu_data_cmd.pi_alpha[0] = 0x00; + spu_data_cmd.pi_alpha[1] = 0x0f; + spu_data_cmd.pi_alpha[2] = 0x0f; + spu_data_cmd.pi_alpha[3] = 0x0f; + /* Initialize the structure */ p_spu->i_start = p_spu->i_stop = 0; p_spu->b_ephemer = false; @@ -181,18 +197,7 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, memset( p_spu_properties, 0, sizeof(*p_spu_properties) ); /* */ - p_spu_data->pi_offset[0] = -1; - p_spu_data->pi_offset[1] = -1; - p_spu_data->p_data = NULL; - p_spu_data->b_palette = false; - p_spu_data->b_auto_crop = false; - p_spu_data->i_y_top_offset = 0; - p_spu_data->i_y_bottom_offset = 0; - - p_spu_data->pi_alpha[0] = 0x00; - p_spu_data->pi_alpha[1] = 0x0f; - p_spu_data->pi_alpha[2] = 0x0f; - p_spu_data->pi_alpha[3] = 0x0f; + *p_spu_data = spu_data_cmd; for( i_index = 4 + p_sys->i_rle_size; i_index < p_sys->i_spu_size ; ) { @@ -206,6 +211,9 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, return VLC_EGENERIC; } + /* */ + b_cmd_offset = false; + b_cmd_alpha = false; /* Get the control sequence date */ date = (mtime_t)GetWBE( &p_sys->buffer[i_index] ) * 11000; @@ -257,7 +265,7 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, unsigned int idx[4]; int i; - p_spu_data->b_palette = true; + spu_data_cmd.b_palette = true; idx[0] = (p_sys->buffer[i_index+1]>>4)&0x0f; idx[1] = (p_sys->buffer[i_index+1])&0x0f; @@ -269,9 +277,9 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, uint32_t i_color = p_dec->fmt_in.subs.spu.palette[1+idx[i]]; /* FIXME: this job should be done sooner */ - p_spu_data->pi_yuv[3-i][0] = (i_color>>16) & 0xff; - p_spu_data->pi_yuv[3-i][1] = (i_color>>0) & 0xff; - p_spu_data->pi_yuv[3-i][2] = (i_color>>8) & 0xff; + spu_data_cmd.pi_yuv[3-i][0] = (i_color>>16) & 0xff; + spu_data_cmd.pi_yuv[3-i][1] = (i_color>>0) & 0xff; + spu_data_cmd.pi_yuv[3-i][2] = (i_color>>8) & 0xff; } } @@ -285,10 +293,14 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, return VLC_EGENERIC; } - p_spu_data->pi_alpha[3] = (p_sys->buffer[i_index+1]>>4)&0x0f; - p_spu_data->pi_alpha[2] = (p_sys->buffer[i_index+1])&0x0f; - p_spu_data->pi_alpha[1] = (p_sys->buffer[i_index+2]>>4)&0x0f; - p_spu_data->pi_alpha[0] = (p_sys->buffer[i_index+2])&0x0f; + if(!p_sys->b_disabletrans) + { /* If we want to use original transparency values */ + b_cmd_alpha = true; + spu_data_cmd.pi_alpha[3] = (p_sys->buffer[i_index+1]>>4)&0x0f; + spu_data_cmd.pi_alpha[2] = (p_sys->buffer[i_index+1])&0x0f; + spu_data_cmd.pi_alpha[1] = (p_sys->buffer[i_index+2]>>4)&0x0f; + spu_data_cmd.pi_alpha[0] = (p_sys->buffer[i_index+2])&0x0f; + } i_index += 3; break; @@ -324,12 +336,25 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, return VLC_EGENERIC; } + b_cmd_offset = true; p_spu_data->pi_offset[0] = GetWBE(&p_sys->buffer[i_index+1]) - 4; p_spu_data->pi_offset[1] = GetWBE(&p_sys->buffer[i_index+3]) - 4; i_index += 5; break; case SPU_CMD_END: /* ff (end) */ + if( b_cmd_offset ) + { + /* It seems that palette and alpha from the block having + * the cmd offset have to be used + * XXX is it all ? */ + p_spu_data->b_palette = spu_data_cmd.b_palette; + if( spu_data_cmd.b_palette ) + memcpy( p_spu_data->pi_yuv, spu_data_cmd.pi_yuv, sizeof(spu_data_cmd.pi_yuv) ); + if( b_cmd_alpha ) + memcpy( p_spu_data->pi_alpha, spu_data_cmd.pi_alpha, sizeof(spu_data_cmd.pi_alpha) ); + } + i_index += 1; break; @@ -359,16 +384,9 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu, } } - /* We need to check for quit commands here */ - if( !vlc_object_alive (p_dec) ) - { - return VLC_EGENERIC; - } - + /* */ if( i_command == SPU_CMD_END && i_index != i_next_seq ) - { break; - } } /* Check that the next sequence index matches the current one */ @@ -449,7 +467,7 @@ static int ParseRLE( decoder_t *p_dec, bool b_empty_top = true; unsigned int i_skipped_top = 0, i_skipped_bottom = 0; unsigned int i_transparent_code = 0; - + /* Colormap statistics */ int i_border = -1; int stats[4]; stats[0] = stats[1] = stats[2] = stats[3] = 0; @@ -598,7 +616,7 @@ static int ParseRLE( decoder_t *p_dec, p_spu->i_width, i_height, p_spu->i_x, i_y ); #endif } - + /* Handle color if no palette was found */ if( !p_spu_data->b_palette ) { @@ -672,8 +690,9 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu, /* Create a new subpicture region */ memset( &fmt, 0, sizeof(video_format_t) ); - fmt.i_chroma = VLC_FOURCC('Y','U','V','P'); - fmt.i_aspect = 0; /* 0 means use aspect ratio of background video */ + fmt.i_chroma = VLC_CODEC_YUVP; + fmt.i_sar_num = 0; /* 0 means use aspect ratio of background video */ + fmt.i_sar_den = 1; fmt.i_width = fmt.i_visible_width = p_spu_properties->i_width; fmt.i_height = fmt.i_visible_height = p_spu_properties->i_height - p_spu_data->i_y_top_offset - p_spu_data->i_y_bottom_offset; @@ -685,9 +704,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu, fmt.p_palette->palette[i_x][0] = p_spu_data->pi_yuv[i_x][0]; fmt.p_palette->palette[i_x][1] = p_spu_data->pi_yuv[i_x][1]; fmt.p_palette->palette[i_x][2] = p_spu_data->pi_yuv[i_x][2]; - fmt.p_palette->palette[i_x][3] = - p_spu_data->pi_alpha[i_x] == 0xf ? 0xff : - p_spu_data->pi_alpha[i_x] << 4; + fmt.p_palette->palette[i_x][3] = p_spu_data->pi_alpha[i_x] * 0x11; } p_spu->p_region = subpicture_region_New( &fmt );