1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Support 48-bit RGB PPM image.

Originally committed as revision 17511 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Peter Ross 2009-02-22 00:56:55 +00:00
parent 88c21a6f14
commit 001821904e
2 changed files with 13 additions and 3 deletions

View File

@ -138,8 +138,11 @@ int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s){
avctx->pix_fmt = PIX_FMT_GRAY16BE; avctx->pix_fmt = PIX_FMT_GRAY16BE;
if (s->maxval != 65535) if (s->maxval != 65535)
avctx->pix_fmt = PIX_FMT_GRAY16; avctx->pix_fmt = PIX_FMT_GRAY16;
} if (avctx->pix_fmt == PIX_FMT_RGB24) {
if (s->maxval > 255)
avctx->pix_fmt = PIX_FMT_RGB48BE;
} else { } 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; avctx->pix_fmt = PIX_FMT_NONE;
return -1; return -1;
} }

View File

@ -63,6 +63,9 @@ static int pnm_decode_frame(AVCodecContext *avctx,
switch(avctx->pix_fmt) { switch(avctx->pix_fmt) {
default: default:
return -1; return -1;
case PIX_FMT_RGB48BE:
n = avctx->width * 6;
goto do_read;
case PIX_FMT_RGB24: case PIX_FMT_RGB24:
n = avctx->width * 3; n = avctx->width * 3;
goto do_read; goto do_read;
@ -195,6 +198,10 @@ static int pnm_encode_frame(AVCodecContext *avctx, unsigned char *outbuf, int bu
c = '6'; c = '6';
n = avctx->width * 3; n = avctx->width * 3;
break; break;
case PIX_FMT_RGB48BE:
c = '6';
n = avctx->width * 6;
break;
case PIX_FMT_YUV420P: case PIX_FMT_YUV420P:
c = '5'; c = '5';
n = avctx->width; n = avctx->width;
@ -209,7 +216,7 @@ static int pnm_encode_frame(AVCodecContext *avctx, unsigned char *outbuf, int bu
s->bytestream += strlen(s->bytestream); s->bytestream += strlen(s->bytestream);
if (avctx->pix_fmt != PIX_FMT_MONOWHITE) { if (avctx->pix_fmt != PIX_FMT_MONOWHITE) {
snprintf(s->bytestream, s->bytestream_end - s->bytestream, 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); s->bytestream += strlen(s->bytestream);
} }
@ -394,7 +401,7 @@ AVCodec ppm_encoder = {
pnm_encode_frame, pnm_encode_frame,
NULL, //encode_end, NULL, //encode_end,
pnm_decode_frame, 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"), .long_name= NULL_IF_CONFIG_SMALL("PPM (Portable PixelMap) image"),
}; };
#endif // CONFIG_PPM_ENCODER #endif // CONFIG_PPM_ENCODER