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_internal.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  .p.name = "mjpeg_vaapi",
147  .p.type = AVMEDIA_TYPE_VIDEO,
148  .p.id = AV_CODEC_ID_MJPEG,
149  .p.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 };
ff_vaapi_get_surface_id
static VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
Definition: vaapi_decode.h:30
VAAPIDecodeContext
Definition: vaapi_decode.h:50
vaapi_decode.h
av_unused
#define av_unused
Definition: attributes.h:131
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
mjpegdec.h
VAAPIDecodePicture
Definition: vaapi_decode.h:39
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:62
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:33
FFHWAccel
Definition: hwaccel_internal.h:34
fail
#define fail()
Definition: checkasm.h:179
VAAPIDecodePicture::output_surface
VASurfaceID output_surface
Definition: vaapi_decode.h:40
quant
static const uint8_t quant[64]
Definition: vmixdec.c:71
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_vaapi_decode_init
int ff_vaapi_decode_init(AVCodecContext *avctx)
Definition: vaapi_decode.c:660
ff_vaapi_common_frame_params
int ff_vaapi_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: vaapi_decode.c:636
ff_vaapi_decode_uninit
int ff_vaapi_decode_uninit(AVCodecContext *avctx)
Definition: vaapi_decode.c:706
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:151
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Definition: hwaccel_internal.h:31
hwaccel_internal.h
MJpegDecodeContext
Definition: mjpegdec.h:54
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:365
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
sp
#define sp
Definition: regdef.h:63
size
int size
Definition: twinvq_data.h:10344
ff_vaapi_decode_cancel
int ff_vaapi_decode_cancel(AVCodecContext *avctx, VAAPIDecodePicture *pic)
Definition: vaapi_decode.c:225
AV_PIX_FMT_VAAPI
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition: pixfmt.h:126
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:2094
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:59
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
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:255
vaapi_mjpeg_decode_slice
static int vaapi_mjpeg_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vaapi_mjpeg.c:72
AVCodecContext::height
int height
Definition: avcodec.h:618
AVCodecContext
main external API structure.
Definition: avcodec.h:445
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
ff_mjpeg_vaapi_hwaccel
const FFHWAccel ff_mjpeg_vaapi_hwaccel
Definition: vaapi_mjpeg.c:145
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:472
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:618