From: Kitae Kim Date: Tue, 9 Jul 2013 09:21:18 +0000 (+0900) Subject: maru_codec: support other pixel formats. X-Git-Tag: TizenStudio_2.0_p2.3~784 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=620bb7649e94d4d076f06f65ca0f7e3619a75c8c;p=sdk%2Femulator%2Fqemu.git maru_codec: support other pixel formats. Those pixel formats were missing. Change-Id: I80b19aea770cf43d0b2763972510bdd2eb92330a Signed-off-by: Kitae Kim --- diff --git a/tizen/src/hw/maru_codec.c b/tizen/src/hw/maru_codec.c index ad9797f..83c9947 100644 --- a/tizen/src/hw/maru_codec.c +++ b/tizen/src/hw/maru_codec.c @@ -336,9 +336,9 @@ void qemu_reset_codec_info(SVCodecState *s, uint32_t value) for (ctx_idx = 0; ctx_idx < CODEC_CONTEXT_MAX; ctx_idx++) { if (s->codec_ctx[ctx_idx].file_index == value) { TRACE("reset %d context\n", ctx_idx); - qemu_mutex_unlock(&s->thread_mutex); - qemu_av_free(s, ctx_idx); - qemu_mutex_lock(&s->thread_mutex); + qemu_mutex_unlock(&s->thread_mutex); + qemu_av_free(s, ctx_idx); + qemu_mutex_lock(&s->thread_mutex); s->codec_ctx[ctx_idx].avctx_use = false; break; } @@ -398,6 +398,16 @@ static void qemu_init_pix_fmt_info(void) pix_fmt_info[PIX_FMT_YUV411P].x_chroma_shift = 2; pix_fmt_info[PIX_FMT_YUV411P].y_chroma_shift = 0; + /* JPEG YUV */ + pix_fmt_info[PIX_FMT_YUVJ420P].x_chroma_shift = 1; + pix_fmt_info[PIX_FMT_YUVJ420P].y_chroma_shift = 1; + + pix_fmt_info[PIX_FMT_YUVJ422P].x_chroma_shift = 1; + pix_fmt_info[PIX_FMT_YUVJ422P].y_chroma_shift = 0; + + pix_fmt_info[PIX_FMT_YUVJ444P].x_chroma_shift = 0; + pix_fmt_info[PIX_FMT_YUVJ444P].y_chroma_shift = 0; + /* RGB formats */ pix_fmt_info[PIX_FMT_RGB24].x_chroma_shift = 0; pix_fmt_info[PIX_FMT_RGB24].y_chroma_shift = 0; @@ -413,6 +423,9 @@ static void qemu_init_pix_fmt_info(void) pix_fmt_info[PIX_FMT_RGB555].x_chroma_shift = 0; pix_fmt_info[PIX_FMT_RGB555].y_chroma_shift = 0; + + pix_fmt_info[PIX_FMT_YUVA420P].x_chroma_shift = 1, + pix_fmt_info[PIX_FMT_YUVA420P].y_chroma_shift = 1; } static uint8_t *qemu_malloc_avpicture (int picture_size) @@ -445,6 +458,9 @@ static int qemu_avpicture_fill(AVPicture *picture, uint8_t *ptr, case PIX_FMT_YUV444P: case PIX_FMT_YUV410P: case PIX_FMT_YUV411P: + case PIX_FMT_YUVJ420P: + case PIX_FMT_YUVJ422P: + case PIX_FMT_YUVJ444P: stride = ROUND_UP_4(width); h2 = ROUND_UP_X(height, pinfo->y_chroma_shift); size = stride * h2; @@ -466,14 +482,39 @@ static int qemu_avpicture_fill(AVPicture *picture, uint8_t *ptr, picture->linesize[1] = stride2; picture->linesize[2] = stride2; picture->linesize[3] = 0; - TRACE("planes %d %d %d", 0, size, size + size2); - TRACE("strides %d %d %d", stride, stride2, stride2); + TRACE("planes %d %d %d\n", 0, size, size + size2); + TRACE("strides %d %d %d\n", stride, stride2, stride2); + break; + case PIX_FMT_YUVA420P: + stride = ROUND_UP_4 (width); + h2 = ROUND_UP_X (height, pinfo->y_chroma_shift); + size = stride * h2; + w2 = DIV_ROUND_UP_X (width, pinfo->x_chroma_shift); + stride2 = ROUND_UP_4 (w2); + h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift); + size2 = stride2 * h2; + fsize = 2 * size + 2 * size2; + TRACE("stride %d, stride2 %d, size %d, size2 %d, fsize %d\n", + stride, stride2, size, size2, fsize); + if (!encode && !ptr) { + ptr = qemu_malloc_avpicture(fsize); + } + picture->data[0] = ptr; + picture->data[1] = picture->data[0] + size; + picture->data[2] = picture->data[1] + size2; + picture->data[3] = picture->data[2] + size2; + picture->linesize[0] = stride; + picture->linesize[1] = stride2; + picture->linesize[2] = stride2; + picture->linesize[3] = stride; + TRACE("planes %d %d %d %d\n", 0, size, size + size2, size + 2 * size2); + TRACE("strides %d %d %d %d\n", stride, stride2, stride2, stride); break; case PIX_FMT_RGB24: case PIX_FMT_BGR24: stride = ROUND_UP_4 (width * 3); fsize = stride * height; - TRACE("stride: %d, size: %d\n", stride, fsize); + TRACE("stride: %d, fsize: %d\n", stride, fsize); if (!encode && !ptr) { ptr = qemu_malloc_avpicture(fsize); } @@ -489,7 +530,7 @@ static int qemu_avpicture_fill(AVPicture *picture, uint8_t *ptr, case PIX_FMT_RGB32: stride = width * 4; fsize = stride * height; - TRACE("stride: %d, size: %d\n", stride, fsize); + TRACE("stride: %d, fsize: %d\n", stride, fsize); if (!encode && !ptr) { ptr = qemu_malloc_avpicture(fsize); } @@ -504,9 +545,62 @@ static int qemu_avpicture_fill(AVPicture *picture, uint8_t *ptr, break; case PIX_FMT_RGB555: case PIX_FMT_RGB565: + case PIX_FMT_YUYV422: + case PIX_FMT_UYVY422: stride = ROUND_UP_4 (width * 2); fsize = stride * height; - TRACE("stride: %d, size: %d\n", stride, fsize); + TRACE("stride: %d, fsize: %d\n", stride, fsize); + if (!encode && !ptr) { + ptr = qemu_malloc_avpicture(fsize); + } + picture->data[0] = ptr; + picture->data[1] = NULL; + picture->data[2] = NULL; + picture->data[3] = NULL; + picture->linesize[0] = stride; + picture->linesize[1] = 0; + picture->linesize[2] = 0; + picture->linesize[3] = 0; + break; + case PIX_FMT_UYYVYY411: + /* FIXME, probably not the right stride */ + stride = ROUND_UP_4 (width); + size = stride * height; + fsize = size + size / 2; + TRACE("stride %d, size %d, fsize %d\n", stride, size, fsize); + if (!encode && !ptr) { + ptr = qemu_malloc_avpicture(fsize); + } + picture->data[0] = ptr; + picture->data[1] = NULL; + picture->data[2] = NULL; + picture->data[3] = NULL; + picture->linesize[0] = width + width / 2; + picture->linesize[1] = 0; + picture->linesize[2] = 0; + picture->linesize[3] = 0; + break; + case PIX_FMT_GRAY8: + stride = ROUND_UP_4 (width); + fsize = stride * height; + TRACE("stride %d, fsize %d\n", stride, fsize); + if (!encode && !ptr) { + ptr = qemu_malloc_avpicture(fsize); + } + picture->data[0] = ptr; + picture->data[1] = NULL; + picture->data[2] = NULL; + picture->data[3] = NULL; + picture->linesize[0] = stride; + picture->linesize[1] = 0; + picture->linesize[2] = 0; + picture->linesize[3] = 0; + break; + case PIX_FMT_MONOWHITE: + case PIX_FMT_MONOBLACK: + stride = ROUND_UP_4 ((width + 7) >> 3); + fsize = stride * height; + TRACE("stride %d, fsize %d\n", stride, fsize); if (!encode && !ptr) { ptr = qemu_malloc_avpicture(fsize); } @@ -519,6 +613,24 @@ static int qemu_avpicture_fill(AVPicture *picture, uint8_t *ptr, picture->linesize[2] = 0; picture->linesize[3] = 0; break; + case PIX_FMT_PAL8: + /* already forced to be with stride, so same result as other function */ + stride = ROUND_UP_4 (width); + size = stride * height; + fsize = size + 256 * 4; + TRACE("stride %d, size %d, fsize %d\n", stride, size, fsize); + if (!encode && !ptr) { + ptr = qemu_malloc_avpicture(fsize); + } + picture->data[0] = ptr; + picture->data[1] = ptr + size; /* palette is stored here as 256 32 bit words */ + picture->data[2] = NULL; + picture->data[3] = NULL; + picture->linesize[0] = stride; + picture->linesize[1] = 4; + picture->linesize[2] = 0; + picture->linesize[3] = 0; + break; default: picture->data[0] = NULL; picture->data[1] = NULL; @@ -647,7 +759,7 @@ int qemu_avcodec_open(SVCodecState *s) if (codec->type == AVMEDIA_TYPE_AUDIO) { s->codec_ctx[ctx_index].mem_index = s->codec_param.mem_index; TRACE("set mem_index: %d into ctx_index: %d.\n", - s->codec_ctx[ctx_index].mem_index, ctx_index); + s->codec_ctx[ctx_index].mem_index, ctx_index); } #if 0