]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/pnmenc.c
Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
[ffmpeg] / libavcodec / pnmenc.c
index 7ea286a878f96fd4cb1c6ca3f04cddc1530c8e5b..c60e4da2c0d7a1d16dbd1255cd2a421c8f648f46 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * PNM image format
- * Copyright (c) 2002, 2003 Fabrice Bellard.
+ * Copyright (c) 2002, 2003 Fabrice Bellard
  *
  * This file is part of FFmpeg.
  *
@@ -34,8 +34,10 @@ static av_cold int common_init(AVCodecContext *avctx){
 
 static int pnm_decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     PNMContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&s->picture;
@@ -63,6 +65,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 +200,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 +218,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);
     }
 
@@ -354,7 +363,23 @@ static int pam_probe(AVProbeData *pd)
 #endif
 
 
-#ifdef CONFIG_PGM_ENCODER
+#if CONFIG_PGM_DECODER
+AVCodec pgm_decoder = {
+    "pgm",
+    CODEC_TYPE_VIDEO,
+    CODEC_ID_PGM,
+    sizeof(PNMContext),
+    common_init,
+    NULL,
+    NULL,
+    pnm_decode_frame,
+    CODEC_CAP_DR1,
+    .pix_fmts= (enum PixelFormat[]){PIX_FMT_GRAY8, PIX_FMT_GRAY16BE, PIX_FMT_NONE},
+    .long_name= NULL_IF_CONFIG_SMALL("PGM (Portable GrayMap) image"),
+};
+#endif
+
+#if CONFIG_PGM_ENCODER
 AVCodec pgm_encoder = {
     "pgm",
     CODEC_TYPE_VIDEO,
@@ -362,14 +387,28 @@ AVCodec pgm_encoder = {
     sizeof(PNMContext),
     common_init,
     pnm_encode_frame,
-    NULL, //encode_end,
-    pnm_decode_frame,
     .pix_fmts= (enum PixelFormat[]){PIX_FMT_GRAY8, PIX_FMT_GRAY16BE, PIX_FMT_NONE},
-    .long_name= "PGM (Portable GrayMap) image",
+    .long_name= NULL_IF_CONFIG_SMALL("PGM (Portable GrayMap) image"),
 };
 #endif // CONFIG_PGM_ENCODER
 
-#ifdef CONFIG_PGMYUV_ENCODER
+#if CONFIG_PGMYUV_DECODER
+AVCodec pgmyuv_decoder = {
+    "pgmyuv",
+    CODEC_TYPE_VIDEO,
+    CODEC_ID_PGMYUV,
+    sizeof(PNMContext),
+    common_init,
+    NULL,
+    NULL,
+    pnm_decode_frame,
+    CODEC_CAP_DR1,
+    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
+    .long_name= NULL_IF_CONFIG_SMALL("PGMYUV (Portable GrayMap YUV) image"),
+};
+#endif
+
+#if CONFIG_PGMYUV_ENCODER
 AVCodec pgmyuv_encoder = {
     "pgmyuv",
     CODEC_TYPE_VIDEO,
@@ -377,14 +416,28 @@ AVCodec pgmyuv_encoder = {
     sizeof(PNMContext),
     common_init,
     pnm_encode_frame,
-    NULL, //encode_end,
-    pnm_decode_frame,
     .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
-    .long_name= "PGMYUV (Portable GrayMap YUV) image",
+    .long_name= NULL_IF_CONFIG_SMALL("PGMYUV (Portable GrayMap YUV) image"),
 };
 #endif // CONFIG_PGMYUV_ENCODER
 
-#ifdef CONFIG_PPM_ENCODER
+#if CONFIG_PPM_DECODER
+AVCodec ppm_decoder = {
+    "ppm",
+    CODEC_TYPE_VIDEO,
+    CODEC_ID_PPM,
+    sizeof(PNMContext),
+    common_init,
+    NULL,
+    NULL,
+    pnm_decode_frame,
+    CODEC_CAP_DR1,
+    .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB48BE, PIX_FMT_NONE},
+    .long_name= NULL_IF_CONFIG_SMALL("PPM (Portable PixelMap) image"),
+};
+#endif
+
+#if CONFIG_PPM_ENCODER
 AVCodec ppm_encoder = {
     "ppm",
     CODEC_TYPE_VIDEO,
@@ -392,14 +445,28 @@ AVCodec ppm_encoder = {
     sizeof(PNMContext),
     common_init,
     pnm_encode_frame,
-    NULL, //encode_end,
-    pnm_decode_frame,
-    .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_NONE},
-    .long_name= "PPM (Portable PixelMap) image",
+    .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
 
-#ifdef CONFIG_PBM_ENCODER
+#if CONFIG_PBM_DECODER
+AVCodec pbm_decoder = {
+    "pbm",
+    CODEC_TYPE_VIDEO,
+    CODEC_ID_PBM,
+    sizeof(PNMContext),
+    common_init,
+    NULL,
+    NULL,
+    pnm_decode_frame,
+    CODEC_CAP_DR1,
+    .pix_fmts= (enum PixelFormat[]){PIX_FMT_MONOWHITE, PIX_FMT_NONE},
+    .long_name= NULL_IF_CONFIG_SMALL("PBM (Portable BitMap) image"),
+};
+#endif
+
+#if CONFIG_PBM_ENCODER
 AVCodec pbm_encoder = {
     "pbm",
     CODEC_TYPE_VIDEO,
@@ -407,14 +474,28 @@ AVCodec pbm_encoder = {
     sizeof(PNMContext),
     common_init,
     pnm_encode_frame,
-    NULL, //encode_end,
-    pnm_decode_frame,
     .pix_fmts= (enum PixelFormat[]){PIX_FMT_MONOWHITE, PIX_FMT_NONE},
-    .long_name= "PBM (Portable BitMap) image",
+    .long_name= NULL_IF_CONFIG_SMALL("PBM (Portable BitMap) image"),
 };
 #endif // CONFIG_PBM_ENCODER
 
-#ifdef CONFIG_PAM_ENCODER
+#if CONFIG_PAM_DECODER
+AVCodec pam_decoder = {
+    "pam",
+    CODEC_TYPE_VIDEO,
+    CODEC_ID_PAM,
+    sizeof(PNMContext),
+    common_init,
+    NULL,
+    NULL,
+    pnm_decode_frame,
+    CODEC_CAP_DR1,
+    .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB32, PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, PIX_FMT_NONE},
+    .long_name= NULL_IF_CONFIG_SMALL("PAM (Portable AnyMap) image"),
+};
+#endif
+
+#if CONFIG_PAM_ENCODER
 AVCodec pam_encoder = {
     "pam",
     CODEC_TYPE_VIDEO,
@@ -422,9 +503,7 @@ AVCodec pam_encoder = {
     sizeof(PNMContext),
     common_init,
     pam_encode_frame,
-    NULL, //encode_end,
-    pnm_decode_frame,
     .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB32, PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, PIX_FMT_NONE},
-    .long_name= "PAM (Portable AnyMap) image",
+    .long_name= NULL_IF_CONFIG_SMALL("PAM (Portable AnyMap) image"),
 };
 #endif // CONFIG_PAM_ENCODER