From: SeokYeon Hwang Date: Tue, 26 Aug 2014 09:24:42 +0000 (+0900) Subject: brillcodec: enhance exception handling X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.2~620^2~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=923e8209c98f33fc85aa77b6f5ae957acf257d3f;p=sdk%2Femulator%2Fqemu.git brillcodec: enhance exception handling Enhance exception handling if no picture was got. Fix bug when using old decode API. Change-Id: I6ea97ead1c0be7c672fa478c5f4bd971cfb6e3f9 Signed-off-by: SeokYeon Hwang --- diff --git a/tizen/src/hw/pci/maru_brillcodec.c b/tizen/src/hw/pci/maru_brillcodec.c index 4bd4308f61..c0fc77f0f6 100644 --- a/tizen/src/hw/pci/maru_brillcodec.c +++ b/tizen/src/hw/pci/maru_brillcodec.c @@ -164,12 +164,13 @@ static DataHandler default_data_handler = { static void copy_picture(void *dst, void *opaque, size_t size) { DataContainer *dc = (DataContainer *)opaque; + if (dc->len_data_buffer) { memcpy(dst, dc->data_buffer, dc->len_data_buffer); } if (dc->frame) { - avpicture_layout((AVPicture *)dc->frame, PIX_FMT_YUV420P, dc->frame->width, dc->frame->height, - dst + OFFSET_PICTURE_BUFFER, size - OFFSET_PICTURE_BUFFER); // FIXME + avpicture_layout((AVPicture *)dc->frame, dc->pix_fmt, dc->frame->width, dc->frame->height, + dst + dc->picture_buffer_offset, size - dc->picture_buffer_offset); // FIXME } } @@ -1213,37 +1214,42 @@ static bool codec_decode_video2(MaruBrillCodecState *s, int ctx_id, void *data_b memcpy(tempbuf + size, &got_picture, sizeof(got_picture)); size += sizeof(got_picture); if (avctx) { - avctx->pix_fmt = AV_PIX_FMT_YUV420P; // FIXME deserialize_video_data(avctx, &video); memcpy(tempbuf + size, &video, sizeof(struct video_data)); } } - TRACE("decoded image. pix_fmt: %d width: %d, height: %d\n", - avctx->pix_fmt, avctx->width, avctx->height); - int pict_size = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); + TRACE("decoded image. len: %d got_picture: %d pix_fmt: %d width: %d, height: %d\n", + len, got_picture, avctx->pix_fmt, avctx->width, avctx->height); + + int pict_size = 0; bool ret = true; - if ((pict_size) < 0) { - ERR("picture size: %d\n", pict_size); - ret = false; - } else { - TRACE("picture size: %d\n", pict_size); + DataContainer *dc = g_malloc0(sizeof(DataContainer)); + dc->data_buffer = tempbuf; + dc->len_data_buffer = tempbuf_size; + dc->picture_buffer_offset = OFFSET_PICTURE_BUFFER; - DataContainer *dc = g_malloc0(sizeof(DataContainer)); - dc->data_buffer = tempbuf; - dc->len_data_buffer = tempbuf_size; - if (got_picture) { - dc->frame = picture; - } + if (got_picture) { + pict_size = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); - if (CONTEXT(s, ctx_id)->is_hwaccel) { - brillcodec_push_write_queue(s, dc, OFFSET_PICTURE_BUFFER + pict_size, ctx_id, s->hwaccel_plugin->video_decode_data_handler); + if ((pict_size) < 0) { + ERR("picture size: %d\n", pict_size); + ret = false; } else { - brillcodec_push_write_queue(s, dc, OFFSET_PICTURE_BUFFER + pict_size, ctx_id, &default_video_decode_data_handler); + TRACE("picture size: %d\n", pict_size); + + dc->frame = picture; + dc->pix_fmt = avctx->pix_fmt; } } + if (CONTEXT(s, ctx_id)->is_hwaccel) { + brillcodec_push_write_queue(s, dc, dc->picture_buffer_offset + pict_size, ctx_id, s->hwaccel_plugin->video_decode_data_handler); + } else { + brillcodec_push_write_queue(s, dc, dc->picture_buffer_offset + pict_size, ctx_id, &default_video_decode_data_handler); + } + TRACE("leave: %s\n", __func__); return ret; @@ -1328,7 +1334,6 @@ static bool codec_decode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu memcpy(tempbuf + size, &got_picture, sizeof(got_picture)); size += sizeof(got_picture); if (avctx) { - avctx->pix_fmt = AV_PIX_FMT_YUV420P; // FIXME deserialize_video_data(avctx, &video); memcpy(tempbuf + size, &video, sizeof(struct video_data)); } @@ -1377,6 +1382,7 @@ static bool codec_picture_copy (MaruBrillCodecState *s, int ctx_id, void *elem) DataContainer *dc = g_malloc0(sizeof(DataContainer)); dc->frame = frame; + dc->pix_fmt = avctx->pix_fmt; if (CONTEXT(s, ctx_id)->is_hwaccel) { brillcodec_push_write_queue(s, dc, pict_size, ctx_id, s->hwaccel_plugin->video_decode_data_handler); diff --git a/tizen/src/hw/pci/maru_brillcodec_plugin.h b/tizen/src/hw/pci/maru_brillcodec_plugin.h index 4133c911c1..dc6c2cdebb 100644 --- a/tizen/src/hw/pci/maru_brillcodec_plugin.h +++ b/tizen/src/hw/pci/maru_brillcodec_plugin.h @@ -38,8 +38,10 @@ typedef struct DataContainer { void *data_buffer; size_t len_data_buffer; + size_t picture_buffer_offset; AVFrame *frame; + enum AVPixelFormat pix_fmt; } DataContainer; typedef struct DataHandler { diff --git a/tizen/src/hw/pci/maru_brillcodec_vaapi.c b/tizen/src/hw/pci/maru_brillcodec_vaapi.c index c6e16f48e3..56a7223bb4 100644 --- a/tizen/src/hw/pci/maru_brillcodec_vaapi.c +++ b/tizen/src/hw/pci/maru_brillcodec_vaapi.c @@ -304,7 +304,7 @@ static void vaapi_extract(void *dst, void *opaque, size_t size) memcpy(dst, dc->data_buffer, dc->len_data_buffer); } if (dc->frame) { - extract(dc->frame, dst + OFFSET_PICTURE_BUFFER, size - OFFSET_PICTURE_BUFFER); + extract(dc->frame, dst + dc->picture_buffer_offset, size - dc->picture_buffer_offset); } }