From 3dd2f87e61d3c02493a02efca146569dc771cb86 Mon Sep 17 00:00:00 2001 From: Jai Menon Date: Thu, 2 Apr 2009 12:15:04 +0000 Subject: [PATCH] Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422. Patch by Jai Menon Originally committed as revision 18316 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/raw.c | 1 + libavcodec/rawdec.c | 12 ++++++++++++ libavcodec/rawenc.c | 11 ++++++++++- libavformat/isom.c | 2 +- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/libavcodec/raw.c b/libavcodec/raw.c index 28d6b0129b..c79c0125f7 100644 --- a/libavcodec/raw.c +++ b/libavcodec/raw.c @@ -51,6 +51,7 @@ const PixelFormatTag ff_raw_pixelFormatTags[] = { /* quicktime */ { PIX_FMT_UYVY422, MKTAG('2', 'v', 'u', 'y') }, { PIX_FMT_UYVY422, MKTAG('A', 'V', 'U', 'I') }, /* FIXME merge both fields */ + { PIX_FMT_YUYV422, MKTAG('y', 'u', 'v', '2') }, { PIX_FMT_PAL8, MKTAG('W', 'R', 'A', 'W') }, { PIX_FMT_NONE, 0 }, diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c index db44f0c8b4..963e148aa1 100644 --- a/libavcodec/rawdec.c +++ b/libavcodec/rawdec.c @@ -26,6 +26,7 @@ #include "avcodec.h" #include "raw.h" +#include "libavutil/intreadwrite.h" typedef struct RawVideoContext { unsigned char * buffer; /* block of memory for holding one frame */ @@ -144,6 +145,17 @@ static int raw_decode(AVCodecContext *avctx, picture->data[2] = tmp; } + if(avctx->codec_tag == AV_RL32("yuv2") && + avctx->pix_fmt == PIX_FMT_YUYV422) { + int x, y; + uint8_t *line = picture->data[0]; + for(y = 0; y < avctx->height; y++) { + for(x = 0; x < avctx->width; x++) + line[2*x + 1] ^= 0x80; + line += picture->linesize[0]; + } + } + *data_size = sizeof(AVPicture); return buf_size; } diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c index 4e560333e1..82a543ad46 100644 --- a/libavcodec/rawenc.c +++ b/libavcodec/rawenc.c @@ -26,6 +26,7 @@ #include "avcodec.h" #include "raw.h" +#include "libavutil/intreadwrite.h" static av_cold int raw_init_encoder(AVCodecContext *avctx) { @@ -40,8 +41,16 @@ static av_cold int raw_init_encoder(AVCodecContext *avctx) static int raw_encode(AVCodecContext *avctx, unsigned char *frame, int buf_size, void *data) { - return avpicture_layout((AVPicture *)data, avctx->pix_fmt, avctx->width, + int ret = avpicture_layout((AVPicture *)data, avctx->pix_fmt, avctx->width, avctx->height, frame, buf_size); + + if(avctx->codec_tag == AV_RL32("yuv2") && ret > 0 && + avctx->pix_fmt == PIX_FMT_YUYV422) { + int x; + for(x = 1; x < avctx->height*avctx->width*2; x += 2) + frame[x] ^= 0x80; + } + return ret; } AVCodec rawvideo_encoder = { diff --git a/libavformat/isom.c b/libavformat/isom.c index b78d65e8fb..a4b89bdf07 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -61,7 +61,7 @@ const AVCodecTag codec_movvideo_tags[] = { /* { CODEC_ID_, MKTAG('I', 'V', '5', '0') }, *//* Indeo 5.0 */ { CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') }, /* Uncompressed RGB */ -/* { CODEC_ID_RAWVIDEO, MKTAG('Y', 'u', 'v', '2') }, *//* Uncompressed YUV422 */ + { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') }, /* Uncompressed YUV422 */ { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') }, /* YUV with alpha-channel (AVID Uncompressed) */ { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, /* UNCOMPRESSED 8BIT 4:2:2 */