1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include <va/va.h> 20cabdff1aSopenharmony_ci#include <va/va_dec_jpeg.h> 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "hwconfig.h" 23cabdff1aSopenharmony_ci#include "vaapi_decode.h" 24cabdff1aSopenharmony_ci#include "mjpegdec.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_cistatic int vaapi_mjpeg_start_frame(AVCodecContext *avctx, 27cabdff1aSopenharmony_ci av_unused const uint8_t *buffer, 28cabdff1aSopenharmony_ci av_unused uint32_t size) 29cabdff1aSopenharmony_ci{ 30cabdff1aSopenharmony_ci const MJpegDecodeContext *s = avctx->priv_data; 31cabdff1aSopenharmony_ci VAAPIDecodePicture *pic = s->hwaccel_picture_private; 32cabdff1aSopenharmony_ci VAPictureParameterBufferJPEGBaseline pp; 33cabdff1aSopenharmony_ci int err, i; 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci pic->output_surface = ff_vaapi_get_surface_id(s->picture_ptr); 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci pp = (VAPictureParameterBufferJPEGBaseline) { 38cabdff1aSopenharmony_ci .picture_width = avctx->width, 39cabdff1aSopenharmony_ci .picture_height = avctx->height, 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci .num_components = s->nb_components, 42cabdff1aSopenharmony_ci }; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci for (i = 0; i < s->nb_components; i++) { 45cabdff1aSopenharmony_ci pp.components[i].component_id = s->component_id[i]; 46cabdff1aSopenharmony_ci pp.components[i].h_sampling_factor = s->h_count[i]; 47cabdff1aSopenharmony_ci pp.components[i].v_sampling_factor = s->v_count[i]; 48cabdff1aSopenharmony_ci pp.components[i].quantiser_table_selector = s->quant_index[i]; 49cabdff1aSopenharmony_ci } 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci err = ff_vaapi_decode_make_param_buffer(avctx, pic, 52cabdff1aSopenharmony_ci VAPictureParameterBufferType, 53cabdff1aSopenharmony_ci &pp, sizeof(pp)); 54cabdff1aSopenharmony_ci if (err < 0) 55cabdff1aSopenharmony_ci goto fail; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci return 0; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_cifail: 60cabdff1aSopenharmony_ci ff_vaapi_decode_cancel(avctx, pic); 61cabdff1aSopenharmony_ci return err; 62cabdff1aSopenharmony_ci} 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_cistatic int vaapi_mjpeg_end_frame(AVCodecContext *avctx) 65cabdff1aSopenharmony_ci{ 66cabdff1aSopenharmony_ci const MJpegDecodeContext *s = avctx->priv_data; 67cabdff1aSopenharmony_ci VAAPIDecodePicture *pic = s->hwaccel_picture_private; 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci return ff_vaapi_decode_issue(avctx, pic); 70cabdff1aSopenharmony_ci} 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_cistatic int vaapi_mjpeg_decode_slice(AVCodecContext *avctx, 73cabdff1aSopenharmony_ci const uint8_t *buffer, 74cabdff1aSopenharmony_ci uint32_t size) 75cabdff1aSopenharmony_ci{ 76cabdff1aSopenharmony_ci const MJpegDecodeContext *s = avctx->priv_data; 77cabdff1aSopenharmony_ci VAAPIDecodePicture *pic = s->hwaccel_picture_private; 78cabdff1aSopenharmony_ci VAHuffmanTableBufferJPEGBaseline huff; 79cabdff1aSopenharmony_ci VAIQMatrixBufferJPEGBaseline quant; 80cabdff1aSopenharmony_ci VASliceParameterBufferJPEGBaseline sp; 81cabdff1aSopenharmony_ci int err, i, j; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci memset(&huff, 0, sizeof(huff)); 84cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 85cabdff1aSopenharmony_ci huff.load_huffman_table[i] = 1; 86cabdff1aSopenharmony_ci for (j = 0; j < 16; j++) 87cabdff1aSopenharmony_ci huff.huffman_table[i].num_dc_codes[j] = s->raw_huffman_lengths[0][i][j]; 88cabdff1aSopenharmony_ci for (j = 0; j < 12; j++) 89cabdff1aSopenharmony_ci huff.huffman_table[i].dc_values[j] = s->raw_huffman_values[0][i][j]; 90cabdff1aSopenharmony_ci for (j = 0; j < 16; j++) 91cabdff1aSopenharmony_ci huff.huffman_table[i].num_ac_codes[j] = s->raw_huffman_lengths[1][i][j]; 92cabdff1aSopenharmony_ci for (j = 0; j < 162; j++) 93cabdff1aSopenharmony_ci huff.huffman_table[i].ac_values[j] = s->raw_huffman_values[1][i][j]; 94cabdff1aSopenharmony_ci } 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci err = ff_vaapi_decode_make_param_buffer(avctx, pic, 97cabdff1aSopenharmony_ci VAHuffmanTableBufferType, 98cabdff1aSopenharmony_ci &huff, sizeof(huff)); 99cabdff1aSopenharmony_ci if (err < 0) 100cabdff1aSopenharmony_ci goto fail; 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci memset(&quant, 0, sizeof(quant)); 103cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) { 104cabdff1aSopenharmony_ci quant.load_quantiser_table[i] = 1; 105cabdff1aSopenharmony_ci for (j = 0; j < 64; j++) 106cabdff1aSopenharmony_ci quant.quantiser_table[i][j] = s->quant_matrixes[i][j]; 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci err = ff_vaapi_decode_make_param_buffer(avctx, pic, 110cabdff1aSopenharmony_ci VAIQMatrixBufferType, 111cabdff1aSopenharmony_ci &quant, sizeof(quant)); 112cabdff1aSopenharmony_ci if (err < 0) 113cabdff1aSopenharmony_ci goto fail; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci sp = (VASliceParameterBufferJPEGBaseline) { 116cabdff1aSopenharmony_ci .slice_data_size = size, 117cabdff1aSopenharmony_ci .slice_data_offset = 0, 118cabdff1aSopenharmony_ci .slice_data_flag = VA_SLICE_DATA_FLAG_ALL, 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci .slice_horizontal_position = 0, 121cabdff1aSopenharmony_ci .slice_vertical_position = 0, 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci .restart_interval = s->restart_interval, 124cabdff1aSopenharmony_ci .num_mcus = s->mb_width * s->mb_height, 125cabdff1aSopenharmony_ci }; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci sp.num_components = s->nb_components; 128cabdff1aSopenharmony_ci for (i = 0; i < s->nb_components; i++) { 129cabdff1aSopenharmony_ci sp.components[i].component_selector = s->component_id[s->comp_index[i]]; 130cabdff1aSopenharmony_ci sp.components[i].dc_table_selector = s->dc_index[i]; 131cabdff1aSopenharmony_ci sp.components[i].ac_table_selector = s->ac_index[i]; 132cabdff1aSopenharmony_ci } 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &sp, sizeof(sp), buffer, size); 135cabdff1aSopenharmony_ci if (err) 136cabdff1aSopenharmony_ci goto fail; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci return 0; 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_cifail: 141cabdff1aSopenharmony_ci ff_vaapi_decode_cancel(avctx, pic); 142cabdff1aSopenharmony_ci return err; 143cabdff1aSopenharmony_ci} 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ciconst AVHWAccel ff_mjpeg_vaapi_hwaccel = { 146cabdff1aSopenharmony_ci .name = "mjpeg_vaapi", 147cabdff1aSopenharmony_ci .type = AVMEDIA_TYPE_VIDEO, 148cabdff1aSopenharmony_ci .id = AV_CODEC_ID_MJPEG, 149cabdff1aSopenharmony_ci .pix_fmt = AV_PIX_FMT_VAAPI, 150cabdff1aSopenharmony_ci .start_frame = &vaapi_mjpeg_start_frame, 151cabdff1aSopenharmony_ci .end_frame = &vaapi_mjpeg_end_frame, 152cabdff1aSopenharmony_ci .decode_slice = &vaapi_mjpeg_decode_slice, 153cabdff1aSopenharmony_ci .frame_priv_data_size = sizeof(VAAPIDecodePicture), 154cabdff1aSopenharmony_ci .init = &ff_vaapi_decode_init, 155cabdff1aSopenharmony_ci .uninit = &ff_vaapi_decode_uninit, 156cabdff1aSopenharmony_ci .frame_params = &ff_vaapi_common_frame_params, 157cabdff1aSopenharmony_ci .priv_data_size = sizeof(VAAPIDecodeContext), 158cabdff1aSopenharmony_ci .caps_internal = HWACCEL_CAP_ASYNC_SAFE, 159cabdff1aSopenharmony_ci}; 160