]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/jpeg.c
* preAlpha DV encoding support -- there's still a truckload
[ffmpeg] / libavformat / jpeg.c
index 38a955b31d67c9a077ed24051055ed74d6080cbb..c0b7b3b65e00ec5aa6293c448128eccfceb4cbf5 100644 (file)
@@ -42,7 +42,19 @@ static int jpeg_get_buffer(AVCodecContext *c, AVFrame *picture)
 
     info->width = c->width;
     info->height = c->height;
-    info->pix_fmt = c->pix_fmt;
+    switch(c->pix_fmt) {
+    case PIX_FMT_YUV420P:
+        info->pix_fmt = PIX_FMT_YUVJ420P;
+        break;
+    case PIX_FMT_YUV422P:
+        info->pix_fmt = PIX_FMT_YUVJ422P;
+        break;
+    case PIX_FMT_YUV444P:
+        info->pix_fmt = PIX_FMT_YUVJ444P;
+        break;
+    default:
+        return -1;
+    }
     ret = jctx->alloc_cb(jctx->opaque, info);
     if (ret) {
         jctx->ret_code = ret;
@@ -56,8 +68,8 @@ static int jpeg_get_buffer(AVCodecContext *c, AVFrame *picture)
     }
 }
 
-static void img_copy(UINT8 *dst, int dst_wrap, 
-                     UINT8 *src, int src_wrap,
+static void img_copy(uint8_t *dst, int dst_wrap, 
+                     uint8_t *src, int src_wrap,
                      int width, int height)
 {
     for(;height > 0; height--) {
@@ -125,11 +137,11 @@ static int jpeg_read(ByteIOContext *f,
             switch(c->pix_fmt) {
             default:
             case PIX_FMT_YUV420P:
-                w >>= 1;
-                h >>= 1;
+                w = (w + 1) >> 1;
+                h = (h + 1) >> 1;
                 break;
             case PIX_FMT_YUV422P:
-                w >>= 1;
+                w = (w + 1) >> 1;
                 break;
             case PIX_FMT_YUV444P:
                 break;
@@ -148,6 +160,7 @@ static int jpeg_read(ByteIOContext *f,
     return jctx.ret_code;
 }
 
+#ifdef CONFIG_ENCODERS
 static int jpeg_write(ByteIOContext *pb, AVImageInfo *info)
 {
     AVCodecContext *c;
@@ -164,7 +177,20 @@ static int jpeg_write(ByteIOContext *pb, AVImageInfo *info)
         goto fail2;
     c->width = info->width;
     c->height = info->height;
-    c->pix_fmt = info->pix_fmt;
+    /* XXX: currently move that to the codec ? */
+    switch(info->pix_fmt) {
+    case PIX_FMT_YUVJ420P:
+        c->pix_fmt = PIX_FMT_YUV420P;
+        break;
+    case PIX_FMT_YUVJ422P:
+        c->pix_fmt = PIX_FMT_YUV422P;
+        break;
+    case PIX_FMT_YUVJ444P:
+        c->pix_fmt = PIX_FMT_YUV444P;
+        break;
+    default:
+        goto fail1;
+    }
     for(i=0;i<3;i++) {
         picture->data[i] = info->pict.data[i];
         picture->linesize[i] = info->pict.linesize[i];
@@ -196,12 +222,17 @@ static int jpeg_write(ByteIOContext *pb, AVImageInfo *info)
     av_free(c);
     return ret;
 }
+#endif //CONFIG_ENCODERS
 
 AVImageFormat jpeg_image_format = {
     "jpeg",
     "jpg,jpeg",
     jpeg_probe,
     jpeg_read,
-    (1 << PIX_FMT_YUV420P) | (1 << PIX_FMT_YUV422P) | (1 << PIX_FMT_YUV444P),
+    (1 << PIX_FMT_YUVJ420P) | (1 << PIX_FMT_YUVJ422P) | (1 << PIX_FMT_YUVJ444P),
+#ifdef CONFIG_ENCODERS
     jpeg_write,
+#else
+    NULL,
+#endif //CONFIG_ENCODERS
 };