From 4b90dcb8493552c17a811c8b1e6538dae4061f9d Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 26 Jul 2015 14:22:41 +0200 Subject: [PATCH] avcodec/dvbsubdec: Compute default CLUT based on bitmap analysis Fixes displaying subtitles before any CLUT has been received Fixes Ticket153 This will of course not display these initial subtitles in the correct color (as that is not known at that point) but they should look clean and not corrupted Signed-off-by: Michael Niedermayer --- libavcodec/dvbsubdec.c | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/libavcodec/dvbsubdec.c b/libavcodec/dvbsubdec.c index e268e2a38e..9f59b7259f 100644 --- a/libavcodec/dvbsubdec.c +++ b/libavcodec/dvbsubdec.c @@ -754,6 +754,63 @@ static int dvbsub_read_8bit_string(AVCodecContext *avctx, return pixels_read; } +static void compute_default_clut(AVPicture *frame, int w, int h) +{ + uint8_t list[256] = {0}; + uint8_t list_inv[256]; + int counttab[256] = {0}; + int count, i, x, y; + +#define V(x,y) frame->data[0][(x) + (y)*frame->linesize[0]] + for (y = 0; ydata[0][(x) + (y)*frame->linesize[0]] ] + + for (i = 0; i<256; i++) { + int scoretab[256] = {0}; + int bestscore = 0; + int bestv = 0; + for (y = 0; ydata[0][x + y*frame->linesize[0]]; + int l_m = list[v]; + int l_l = x ? L(x-1, y) : 1; + int l_r = x+1 bestscore) { + bestscore = score; + bestv = v; + } + } + } + if (!bestscore) + break; + list [ bestv ] = 1; + list_inv[ i ] = bestv; + } + + count = i - 1; + for (i--; i>=0; i--) { + int v = i*255/count; + AV_WN32(frame->data[1] + 4*list_inv[i], RGBA(v/2,v,v/2,v)); + } +} + + static int save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_output) { DVBSubContext *ctx = avctx->priv_data; @@ -855,6 +912,9 @@ static int save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_ou memcpy(rect->pict.data[0], region->pbuf, region->buf_size); + if (clut == &default_clut) + compute_default_clut(&rect->pict, rect->w, rect->h); + i++; } }