FFmpeg
vaapi_mjpeg.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <va/va.h>
20 #include <va/va_dec_jpeg.h>
21 
22 #include "hwaccel.h"
23 #include "vaapi_decode.h"
24 #include "mjpegdec.h"
25 
27  av_unused const uint8_t *buffer,
28  av_unused uint32_t size)
29 {
30  const MJpegDecodeContext *s = avctx->priv_data;
31  VAAPIDecodePicture *pic = s->hwaccel_picture_private;
32  VAPictureParameterBufferJPEGBaseline pp;
33  int err, i;
34 
35  pic->output_surface = ff_vaapi_get_surface_id(s->picture_ptr);
36 
37  pp = (VAPictureParameterBufferJPEGBaseline) {
38  .picture_width = avctx->width,
39  .picture_height = avctx->height,
40 
41  .num_components = s->nb_components,
42  };
43 
44  for (i = 0; i < s->nb_components; i++) {
45  pp.components[i].component_id = s->component_id[i];
46  pp.components[i].h_sampling_factor = s->h_count[i];
47  pp.components[i].v_sampling_factor = s->v_count[i];
48  pp.components[i].quantiser_table_selector = s->quant_index[i];
49  }
50 
51  err = ff_vaapi_decode_make_param_buffer(avctx, pic,
52  VAPictureParameterBufferType,
53  &pp, sizeof(pp));
54  if (err < 0)
55  goto fail;
56 
57  return 0;
58 
59 fail:
60  ff_vaapi_decode_cancel(avctx, pic);
61  return err;
62 }
63 
65 {
66  const MJpegDecodeContext *s = avctx->priv_data;
67  VAAPIDecodePicture *pic = s->hwaccel_picture_private;
68 
69  return ff_vaapi_decode_issue(avctx, pic);
70 }
71 
73  const uint8_t *buffer,
74  uint32_t size)
75 {
76  const MJpegDecodeContext *s = avctx->priv_data;
77  VAAPIDecodePicture *pic = s->hwaccel_picture_private;
78  VAHuffmanTableBufferJPEGBaseline huff;
79  VAIQMatrixBufferJPEGBaseline quant;
80  VASliceParameterBufferJPEGBaseline sp;
81  int err, i, j;
82 
83  memset(&huff, 0, sizeof(huff));
84  for (i = 0; i < 2; i++) {
85  huff.load_huffman_table[i] = 1;
86  for (j = 0; j < 16; j++)
87  huff.huffman_table[i].num_dc_codes[j] = s->raw_huffman_lengths[0][i][j];
88  for (j = 0; j < 12; j++)
89  huff.huffman_table[i].dc_values[j] = s->raw_huffman_values[0][i][j];
90  for (j = 0; j < 16; j++)
91  huff.huffman_table[i].num_ac_codes[j] = s->raw_huffman_lengths[1][i][j];
92  for (j = 0; j < 162; j++)
93  huff.huffman_table[i].ac_values[j] = s->raw_huffman_values[1][i][j];
94  }
95 
96  err = ff_vaapi_decode_make_param_buffer(avctx, pic,
97  VAHuffmanTableBufferType,
98  &huff, sizeof(huff));
99  if (err < 0)
100  goto fail;
101 
102  memset(&quant, 0, sizeof(quant));
103  for (i = 0; i < 4; i++) {
104  quant.load_quantiser_table[i] = 1;
105  for (j = 0; j < 64; j++)
106  quant.quantiser_table[i][j] = s->quant_matrixes[i][j];
107  }
108 
109  err = ff_vaapi_decode_make_param_buffer(avctx, pic,
110  VAIQMatrixBufferType,
111  &quant, sizeof(quant));
112  if (err < 0)
113  goto fail;
114 
115  sp = (VASliceParameterBufferJPEGBaseline) {
116  .slice_data_size = size,
117  .slice_data_offset = 0,
118  .slice_data_flag = VA_SLICE_DATA_FLAG_ALL,
119 
120  .slice_horizontal_position = 0,
121  .slice_vertical_position = 0,
122 
123  .restart_interval = s->restart_interval,
124  .num_mcus = s->mb_width * s->mb_height,
125  };
126 
127  sp.num_components = s->nb_components;
128  for (i = 0; i < s->nb_components; i++) {
129  sp.components[i].component_selector = s->component_id[s->comp_index[i]];
130  sp.components[i].dc_table_selector = s->dc_index[i];
131  sp.components[i].ac_table_selector = s->ac_index[i];
132  }
133 
134  err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &sp, sizeof(sp), buffer, size);
135  if (err)
136  goto fail;
137 
138  return 0;
139 
140 fail:
141  ff_vaapi_decode_cancel(avctx, pic);
142  return err;
143 }
144 
146  .name = "mjpeg_vaapi",
147  .type = AVMEDIA_TYPE_VIDEO,
148  .id = AV_CODEC_ID_MJPEG,
149  .pix_fmt = AV_PIX_FMT_VAAPI,
150  .start_frame = &vaapi_mjpeg_start_frame,
151  .end_frame = &vaapi_mjpeg_end_frame,
152  .decode_slice = &vaapi_mjpeg_decode_slice,
153  .frame_priv_data_size = sizeof(VAAPIDecodePicture),
156  .frame_params = &ff_vaapi_common_frame_params,
157  .priv_data_size = sizeof(VAAPIDecodeContext),
158  .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
159 };
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Definition: hwaccel.h:26
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
ff_vaapi_get_surface_id
static VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
Definition: vaapi_decode.h:35
VAAPIDecodeContext
Definition: vaapi_decode.h:55
vaapi_decode.h
av_unused
#define av_unused
Definition: attributes.h:125
mjpegdec.h
VAAPIDecodePicture
Definition: vaapi_decode.h:44
ff_vaapi_decode_make_slice_buffer
int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, const void *params_data, size_t params_size, const void *slice_data, size_t slice_size)
Definition: vaapi_decode.c:58
AVHWAccel
Definition: avcodec.h:3649
ff_vaapi_decode_make_param_buffer
int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, int type, const void *data, size_t size)
Definition: vaapi_decode.c:29
fail
#define fail()
Definition: checkasm.h:120
VAAPIDecodePicture::output_surface
VASurfaceID output_surface
Definition: vaapi_decode.h:45
hwaccel.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
ff_vaapi_decode_init
int ff_vaapi_decode_init(AVCodecContext *avctx)
Definition: vaapi_decode.c:610
ff_vaapi_common_frame_params
int ff_vaapi_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: vaapi_decode.c:586
ff_vaapi_decode_uninit
int ff_vaapi_decode_uninit(AVCodecContext *avctx)
Definition: vaapi_decode.c:699
vaapi_mjpeg_start_frame
static int vaapi_mjpeg_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vaapi_mjpeg.c:26
ff_vaapi_decode_issue
int ff_vaapi_decode_issue(AVCodecContext *avctx, VAAPIDecodePicture *pic)
Definition: vaapi_decode.c:150
MJpegDecodeContext
Definition: mjpegdec.h:46
for
for(j=16;j >0;--j)
Definition: h264pred_template.c:469
sp
#define sp
Definition: regdef.h:63
size
int size
Definition: twinvq_data.h:11134
ff_vaapi_decode_cancel
int ff_vaapi_decode_cancel(AVCodecContext *avctx, VAAPIDecodePicture *pic)
Definition: vaapi_decode.c:224
AV_PIX_FMT_VAAPI
@ AV_PIX_FMT_VAAPI
Definition: pixfmt.h:122
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:3655
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: avcodec.h:225
vaapi_mjpeg_end_frame
static int vaapi_mjpeg_end_frame(AVCodecContext *avctx)
Definition: vaapi_mjpeg.c:64
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
vaapi_mjpeg_decode_slice
static int vaapi_mjpeg_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vaapi_mjpeg.c:72
uint8_t
uint8_t
Definition: audio_convert.c:194
AVCodecContext::height
int height
Definition: avcodec.h:1738
ff_mjpeg_vaapi_hwaccel
const AVHWAccel ff_mjpeg_vaapi_hwaccel
Definition: vaapi_mjpeg.c:145
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
quant
const uint8_t * quant
Definition: vorbis_enc_data.h:458
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:1738
uninit
static av_cold int uninit(AVCodecContext *avctx)
Definition: crystalhd.c:279