avcodec/dvbsubdec: Split save_subtitle_set() out
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
							parent
							
								
									77ade55fe5
								
							
						
					
					
						commit
						fbb59a3bf4
					
				@ -759,7 +759,85 @@ static int dvbsub_read_8bit_string(uint8_t *destbuf, int dbuf_len,
 | 
				
			|||||||
    return pixels_read;
 | 
					    return pixels_read;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DVBSubContext *ctx = avctx->priv_data;
 | 
				
			||||||
 | 
					    DVBSubRegionDisplay *display;
 | 
				
			||||||
 | 
					    DVBSubDisplayDefinition *display_def = ctx->display_definition;
 | 
				
			||||||
 | 
					    DVBSubRegion *region;
 | 
				
			||||||
 | 
					    AVSubtitleRect *rect;
 | 
				
			||||||
 | 
					    DVBSubCLUT *clut;
 | 
				
			||||||
 | 
					    uint32_t *clut_table;
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    int offset_x=0, offset_y=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sub->end_display_time = ctx->time_out * 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (display_def) {
 | 
				
			||||||
 | 
					        offset_x = display_def->x;
 | 
				
			||||||
 | 
					        offset_y = display_def->y;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sub->num_rects = 0;
 | 
				
			||||||
 | 
					    for (display = ctx->display_list; display; display = display->next) {
 | 
				
			||||||
 | 
					        region = get_region(ctx, display->region_id);
 | 
				
			||||||
 | 
					        if (region && region->dirty)
 | 
				
			||||||
 | 
					            sub->num_rects++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (sub->num_rects > 0) {
 | 
				
			||||||
 | 
					        sub->rects = av_mallocz_array(sizeof(*sub->rects), sub->num_rects);
 | 
				
			||||||
 | 
					        for(i=0; i<sub->num_rects; i++)
 | 
				
			||||||
 | 
					            sub->rects[i] = av_mallocz(sizeof(*sub->rects[i]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        i = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (display = ctx->display_list; display; display = display->next) {
 | 
				
			||||||
 | 
					            region = get_region(ctx, display->region_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!region)
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!region->dirty)
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            rect = sub->rects[i];
 | 
				
			||||||
 | 
					            rect->x = display->x_pos + offset_x;
 | 
				
			||||||
 | 
					            rect->y = display->y_pos + offset_y;
 | 
				
			||||||
 | 
					            rect->w = region->width;
 | 
				
			||||||
 | 
					            rect->h = region->height;
 | 
				
			||||||
 | 
					            rect->nb_colors = (1 << region->depth);
 | 
				
			||||||
 | 
					            rect->type      = SUBTITLE_BITMAP;
 | 
				
			||||||
 | 
					            rect->pict.linesize[0] = region->width;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            clut = get_clut(ctx, region->clut);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!clut)
 | 
				
			||||||
 | 
					                clut = &default_clut;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            switch (region->depth) {
 | 
				
			||||||
 | 
					            case 2:
 | 
				
			||||||
 | 
					                clut_table = clut->clut4;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 8:
 | 
				
			||||||
 | 
					                clut_table = clut->clut256;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 4:
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                clut_table = clut->clut16;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            rect->pict.data[1] = av_mallocz(AVPALETTE_SIZE);
 | 
				
			||||||
 | 
					            memcpy(rect->pict.data[1], clut_table, (1 << region->depth) * sizeof(uint32_t));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            rect->pict.data[0] = av_malloc(region->buf_size);
 | 
				
			||||||
 | 
					            memcpy(rect->pict.data[0], region->pbuf, region->buf_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            i++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display,
 | 
					static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display,
 | 
				
			||||||
                                          const uint8_t *buf, int buf_size, int top_bottom, int non_mod)
 | 
					                                          const uint8_t *buf, int buf_size, int top_bottom, int non_mod)
 | 
				
			||||||
@ -1150,7 +1228,7 @@ static void dvbsub_parse_region_segment(AVCodecContext *avctx,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dvbsub_parse_page_segment(AVCodecContext *avctx,
 | 
					static void dvbsub_parse_page_segment(AVCodecContext *avctx,
 | 
				
			||||||
                                        const uint8_t *buf, int buf_size)
 | 
					                                        const uint8_t *buf, int buf_size, AVSubtitle *sub)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DVBSubContext *ctx = avctx->priv_data;
 | 
					    DVBSubContext *ctx = avctx->priv_data;
 | 
				
			||||||
    DVBSubRegionDisplay *display;
 | 
					    DVBSubRegionDisplay *display;
 | 
				
			||||||
@ -1371,83 +1449,8 @@ static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf,
 | 
				
			|||||||
                                        int buf_size, AVSubtitle *sub)
 | 
					                                        int buf_size, AVSubtitle *sub)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DVBSubContext *ctx = avctx->priv_data;
 | 
					    DVBSubContext *ctx = avctx->priv_data;
 | 
				
			||||||
    DVBSubDisplayDefinition *display_def = ctx->display_definition;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DVBSubRegion *region;
 | 
					    save_subtitle_set(avctx,sub);
 | 
				
			||||||
    DVBSubRegionDisplay *display;
 | 
					 | 
				
			||||||
    AVSubtitleRect *rect;
 | 
					 | 
				
			||||||
    DVBSubCLUT *clut;
 | 
					 | 
				
			||||||
    uint32_t *clut_table;
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
    int offset_x=0, offset_y=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sub->end_display_time = ctx->time_out * 1000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (display_def) {
 | 
					 | 
				
			||||||
        offset_x = display_def->x;
 | 
					 | 
				
			||||||
        offset_y = display_def->y;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sub->num_rects = 0;
 | 
					 | 
				
			||||||
    for (display = ctx->display_list; display; display = display->next)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        region = get_region(ctx, display->region_id);
 | 
					 | 
				
			||||||
        if (region && region->dirty)
 | 
					 | 
				
			||||||
            sub->num_rects++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (sub->num_rects > 0){
 | 
					 | 
				
			||||||
        sub->rects = av_mallocz_array(sizeof(*sub->rects), sub->num_rects);
 | 
					 | 
				
			||||||
        for(i=0; i<sub->num_rects; i++)
 | 
					 | 
				
			||||||
            sub->rects[i] = av_mallocz(sizeof(*sub->rects[i]));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    i = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (display = ctx->display_list; display; display = display->next) {
 | 
					 | 
				
			||||||
        region = get_region(ctx, display->region_id);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!region)
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!region->dirty)
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        rect = sub->rects[i];
 | 
					 | 
				
			||||||
        rect->x = display->x_pos + offset_x;
 | 
					 | 
				
			||||||
        rect->y = display->y_pos + offset_y;
 | 
					 | 
				
			||||||
        rect->w = region->width;
 | 
					 | 
				
			||||||
        rect->h = region->height;
 | 
					 | 
				
			||||||
        rect->nb_colors = (1 << region->depth);
 | 
					 | 
				
			||||||
        rect->type      = SUBTITLE_BITMAP;
 | 
					 | 
				
			||||||
        rect->pict.linesize[0] = region->width;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        clut = get_clut(ctx, region->clut);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!clut)
 | 
					 | 
				
			||||||
            clut = &default_clut;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        switch (region->depth) {
 | 
					 | 
				
			||||||
        case 2:
 | 
					 | 
				
			||||||
            clut_table = clut->clut4;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case 8:
 | 
					 | 
				
			||||||
            clut_table = clut->clut256;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case 4:
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            clut_table = clut->clut16;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        rect->pict.data[1] = av_mallocz(AVPALETTE_SIZE);
 | 
					 | 
				
			||||||
        memcpy(rect->pict.data[1], clut_table, (1 << region->depth) * sizeof(uint32_t));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        rect->pict.data[0] = av_malloc(region->buf_size);
 | 
					 | 
				
			||||||
        memcpy(rect->pict.data[0], region->pbuf, region->buf_size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        i++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
    save_display_set(ctx);
 | 
					    save_display_set(ctx);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -1511,7 +1514,7 @@ static int dvbsub_decode(AVCodecContext *avctx,
 | 
				
			|||||||
            ctx->composition_id == -1 || ctx->ancillary_id == -1) {
 | 
					            ctx->composition_id == -1 || ctx->ancillary_id == -1) {
 | 
				
			||||||
            switch (segment_type) {
 | 
					            switch (segment_type) {
 | 
				
			||||||
            case DVBSUB_PAGE_SEGMENT:
 | 
					            case DVBSUB_PAGE_SEGMENT:
 | 
				
			||||||
                dvbsub_parse_page_segment(avctx, p, segment_length);
 | 
					                dvbsub_parse_page_segment(avctx, p, segment_length, sub);
 | 
				
			||||||
                got_segment |= 1;
 | 
					                got_segment |= 1;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case DVBSUB_REGION_SEGMENT:
 | 
					            case DVBSUB_REGION_SEGMENT:
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user