From 001821904e316b68c42d1671dcf963e5f7c648f7 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Sun, 22 Feb 2009 00:56:55 +0000 Subject: [PATCH] Support 48-bit RGB PPM image. Originally committed as revision 17511 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/pnm.c | 5 ++++- libavcodec/pnmenc.c | 11 +++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libavcodec/pnm.c b/libavcodec/pnm.c index ba169d1473..4843d14653 100644 --- a/libavcodec/pnm.c +++ b/libavcodec/pnm.c @@ -138,8 +138,11 @@ int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s){ avctx->pix_fmt = PIX_FMT_GRAY16BE; if (s->maxval != 65535) avctx->pix_fmt = PIX_FMT_GRAY16; + } if (avctx->pix_fmt == PIX_FMT_RGB24) { + if (s->maxval > 255) + avctx->pix_fmt = PIX_FMT_RGB48BE; } else { - av_log(avctx, AV_LOG_ERROR, "16-bit components are only supported for grayscale\n"); + av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format\n"); avctx->pix_fmt = PIX_FMT_NONE; return -1; } diff --git a/libavcodec/pnmenc.c b/libavcodec/pnmenc.c index c3316ea0b5..46afbab560 100644 --- a/libavcodec/pnmenc.c +++ b/libavcodec/pnmenc.c @@ -63,6 +63,9 @@ static int pnm_decode_frame(AVCodecContext *avctx, switch(avctx->pix_fmt) { default: return -1; + case PIX_FMT_RGB48BE: + n = avctx->width * 6; + goto do_read; case PIX_FMT_RGB24: n = avctx->width * 3; goto do_read; @@ -195,6 +198,10 @@ static int pnm_encode_frame(AVCodecContext *avctx, unsigned char *outbuf, int bu c = '6'; n = avctx->width * 3; break; + case PIX_FMT_RGB48BE: + c = '6'; + n = avctx->width * 6; + break; case PIX_FMT_YUV420P: c = '5'; n = avctx->width; @@ -209,7 +216,7 @@ static int pnm_encode_frame(AVCodecContext *avctx, unsigned char *outbuf, int bu s->bytestream += strlen(s->bytestream); if (avctx->pix_fmt != PIX_FMT_MONOWHITE) { snprintf(s->bytestream, s->bytestream_end - s->bytestream, - "%d\n", (avctx->pix_fmt != PIX_FMT_GRAY16BE) ? 255 : 65535); + "%d\n", (avctx->pix_fmt != PIX_FMT_GRAY16BE && avctx->pix_fmt != PIX_FMT_RGB48BE) ? 255 : 65535); s->bytestream += strlen(s->bytestream); } @@ -394,7 +401,7 @@ AVCodec ppm_encoder = { pnm_encode_frame, NULL, //encode_end, pnm_decode_frame, - .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_NONE}, + .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB48BE, PIX_FMT_NONE}, .long_name= NULL_IF_CONFIG_SMALL("PPM (Portable PixelMap) image"), }; #endif // CONFIG_PPM_ENCODER