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;
}
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;
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)
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;
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);
}
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);
}
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);
}
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;
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