summaryrefslogtreecommitdiff
path: root/libavcodec/dvbsubdec.c
diff options
context:
space:
mode:
authorAnshul Maheshwari <anshul.ffmpeg@gmail.com>2014-06-14 17:06:37 +0530
committerMichael Niedermayer <michaelni@gmx.at>2014-06-15 20:16:49 +0200
commitfbb59a3bf4c8668197521b3db5f26d0e93aed1a6 (patch)
tree45f5603e2c29b68fa5aa0327766c09e8f22515fe /libavcodec/dvbsubdec.c
parent77ade55fe52e76d3476c009aa42134f58f03ffb2 (diff)
avcodec/dvbsubdec: Split save_subtitle_set() out
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/dvbsubdec.c')
-rw-r--r--libavcodec/dvbsubdec.c159
1 files changed, 81 insertions, 78 deletions
diff --git a/libavcodec/dvbsubdec.c b/libavcodec/dvbsubdec.c
index 958613e04b..e6e746dba6 100644
--- a/libavcodec/dvbsubdec.c
+++ b/libavcodec/dvbsubdec.c
@@ -759,7 +759,85 @@ static int dvbsub_read_8bit_string(uint8_t *destbuf, int dbuf_len,
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,
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,
- const uint8_t *buf, int buf_size)
+ const uint8_t *buf, int buf_size, AVSubtitle *sub)
{
DVBSubContext *ctx = avctx->priv_data;
DVBSubRegionDisplay *display;
@@ -1371,83 +1449,8 @@ static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf,
int buf_size, AVSubtitle *sub)
{
DVBSubContext *ctx = avctx->priv_data;
- DVBSubDisplayDefinition *display_def = ctx->display_definition;
-
- DVBSubRegion *region;
- 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++;
- }
- }
+ save_subtitle_set(avctx,sub);
#ifdef DEBUG
save_display_set(ctx);
#endif
@@ -1511,7 +1514,7 @@ static int dvbsub_decode(AVCodecContext *avctx,
ctx->composition_id == -1 || ctx->ancillary_id == -1) {
switch (segment_type) {
case DVBSUB_PAGE_SEGMENT:
- dvbsub_parse_page_segment(avctx, p, segment_length);
+ dvbsub_parse_page_segment(avctx, p, segment_length, sub);
got_segment |= 1;
break;
case DVBSUB_REGION_SEGMENT: