[FFmpeg-devel] [PATCH]lavc/pgssubdec: Fix palette colourspace
Carl Eugen Hoyos
cehoyos at ag.or.at
Sun Apr 17 21:08:45 CEST 2016
On Sunday 17 April 2016 08:41:32 pm Jan Ekstrom wrote:
> Yes, the YCbCr values in palettes are matched accordingly against the
> video stream. As per the specification:
> "Y, Cr and Cb shall have the same color matrix as the associated HDMV
> Video stream: 525-60/625-50 (Rec.601); 1080i, 720p (ITU-709)"
Does attached make it better?
Carl Eugen
-------------- next part --------------
diff --git a/libavcodec/pgssubdec.c b/libavcodec/pgssubdec.c
index 07a2a78..29fc09a 100644
--- a/libavcodec/pgssubdec.c
+++ b/libavcodec/pgssubdec.c
@@ -96,6 +96,7 @@ typedef struct PGSSubContext {
PGSSubPalettes palettes;
PGSSubObjects objects;
int forced_subs_only;
+ int hdtv;
} PGSSubContext;
static void flush_cache(AVCodecContext *avctx)
@@ -136,6 +137,9 @@ static PGSSubPalette * find_palette(int id, PGSSubPalettes *palettes)
static av_cold int init_decoder(AVCodecContext *avctx)
{
+ PGSSubContext *ctx = avctx->priv_data;
+ ctx->hdtv = -1;
+
avctx->pix_fmt = AV_PIX_FMT_PAL8;
return 0;
@@ -354,8 +358,13 @@ static int parse_palette_segment(AVCodecContext *avctx,
cb = bytestream_get_byte(&buf);
alpha = bytestream_get_byte(&buf);
- YUV_TO_RGB1(cb, cr);
- YUV_TO_RGB2(r, g, b, y);
+ if (ctx->hdtv > 0) {
+ YUV_TO_RGB1_CCIR(cb, cr);
+ YUV_TO_RGB2_CCIR(r, g, b, y);
+ } else {
+ YUV_TO_RGB1(cb, cr);
+ YUV_TO_RGB2(r, g, b, y);
+ }
ff_dlog(avctx, "Color %d := (%d,%d,%d,%d)\n", color_id, r, g, b, alpha);
@@ -387,6 +396,11 @@ static int parse_presentation_segment(AVCodecContext *avctx,
// Video descriptor
int w = bytestream_get_be16(&buf);
int h = bytestream_get_be16(&buf);
+ if (h > 625 && ctx->hdtv == -1) {
+ ctx->hdtv = 1;
+ } else {
+ ctx->hdtv = 0;
+ }
ctx->presentation.pts = pts;
More information about the ffmpeg-devel
mailing list