vaapi_mpeg2.c
Go to the documentation of this file.
1 /*
2  * MPEG-2 HW decode acceleration through VA API
3  *
4  * Copyright (C) 2008-2009 Splitted-Desktop Systems
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "vaapi_internal.h"
24 
25 /** Reconstruct bitstream f_code */
26 static inline int mpeg2_get_f_code(MpegEncContext *s)
27 {
28  return (s->mpeg_f_code[0][0] << 12) | (s->mpeg_f_code[0][1] << 8) |
29  (s->mpeg_f_code[1][0] << 4) | s->mpeg_f_code[1][1];
30 }
31 
32 /** Determine frame start: first field for field picture or frame picture */
34 {
35  return s->first_field || s->picture_structure == PICT_FRAME;
36 }
37 
39 {
40  struct MpegEncContext * const s = avctx->priv_data;
41  struct vaapi_context * const vactx = avctx->hwaccel_context;
42  VAPictureParameterBufferMPEG2 *pic_param;
43  VAIQMatrixBufferMPEG2 *iq_matrix;
44  int i;
45 
46  av_dlog(avctx, "vaapi_mpeg2_start_frame()\n");
47 
48  vactx->slice_param_size = sizeof(VASliceParameterBufferMPEG2);
49 
50  /* Fill in VAPictureParameterBufferMPEG2 */
51  pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferMPEG2));
52  if (!pic_param)
53  return -1;
54  pic_param->horizontal_size = s->width;
55  pic_param->vertical_size = s->height;
56  pic_param->forward_reference_picture = VA_INVALID_ID;
57  pic_param->backward_reference_picture = VA_INVALID_ID;
58  pic_param->picture_coding_type = s->pict_type;
59  pic_param->f_code = mpeg2_get_f_code(s);
60  pic_param->picture_coding_extension.value = 0; /* reset all bits */
61  pic_param->picture_coding_extension.bits.intra_dc_precision = s->intra_dc_precision;
62  pic_param->picture_coding_extension.bits.picture_structure = s->picture_structure;
63  pic_param->picture_coding_extension.bits.top_field_first = s->top_field_first;
64  pic_param->picture_coding_extension.bits.frame_pred_frame_dct = s->frame_pred_frame_dct;
65  pic_param->picture_coding_extension.bits.concealment_motion_vectors = s->concealment_motion_vectors;
66  pic_param->picture_coding_extension.bits.q_scale_type = s->q_scale_type;
67  pic_param->picture_coding_extension.bits.intra_vlc_format = s->intra_vlc_format;
68  pic_param->picture_coding_extension.bits.alternate_scan = s->alternate_scan;
69  pic_param->picture_coding_extension.bits.repeat_first_field = s->repeat_first_field;
70  pic_param->picture_coding_extension.bits.progressive_frame = s->progressive_frame;
71  pic_param->picture_coding_extension.bits.is_first_field = mpeg2_get_is_frame_start(s);
72 
73  switch (s->pict_type) {
74  case AV_PICTURE_TYPE_B:
75  pic_param->backward_reference_picture = ff_vaapi_get_surface_id(&s->next_picture);
76  // fall-through
77  case AV_PICTURE_TYPE_P:
78  pic_param->forward_reference_picture = ff_vaapi_get_surface_id(&s->last_picture);
79  break;
80  }
81 
82  /* Fill in VAIQMatrixBufferMPEG2 */
83  iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferMPEG2));
84  if (!iq_matrix)
85  return -1;
86  iq_matrix->load_intra_quantiser_matrix = 1;
87  iq_matrix->load_non_intra_quantiser_matrix = 1;
88  iq_matrix->load_chroma_intra_quantiser_matrix = 1;
89  iq_matrix->load_chroma_non_intra_quantiser_matrix = 1;
90 
91  for (i = 0; i < 64; i++) {
93  iq_matrix->intra_quantiser_matrix[i] = s->intra_matrix[n];
94  iq_matrix->non_intra_quantiser_matrix[i] = s->inter_matrix[n];
95  iq_matrix->chroma_intra_quantiser_matrix[i] = s->chroma_intra_matrix[n];
96  iq_matrix->chroma_non_intra_quantiser_matrix[i] = s->chroma_inter_matrix[n];
97  }
98  return 0;
99 }
100 
101 static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
102 {
103  MpegEncContext * const s = avctx->priv_data;
104  VASliceParameterBufferMPEG2 *slice_param;
105  GetBitContext gb;
106  uint32_t quantiser_scale_code, intra_slice_flag, macroblock_offset;
107 
108  av_dlog(avctx, "vaapi_mpeg2_decode_slice(): buffer %p, size %d\n", buffer, size);
109 
110  /* Determine macroblock_offset */
111  init_get_bits(&gb, buffer, 8 * size);
112  if (get_bits_long(&gb, 32) >> 8 != 1) /* start code */
113  return AVERROR_INVALIDDATA;
114  quantiser_scale_code = get_bits(&gb, 5);
115  intra_slice_flag = get_bits1(&gb);
116  if (intra_slice_flag) {
117  skip_bits(&gb, 8);
118  while (get_bits1(&gb) != 0)
119  skip_bits(&gb, 8);
120  }
121  macroblock_offset = get_bits_count(&gb);
122 
123  /* Fill in VASliceParameterBufferMPEG2 */
124  slice_param = (VASliceParameterBufferMPEG2 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
125  if (!slice_param)
126  return -1;
127  slice_param->macroblock_offset = macroblock_offset;
128  slice_param->slice_horizontal_position = s->mb_x;
129  slice_param->slice_vertical_position = s->mb_y >> (s->picture_structure != PICT_FRAME);
130  slice_param->quantiser_scale_code = quantiser_scale_code;
131  slice_param->intra_slice_flag = intra_slice_flag;
132  return 0;
133 }
134 
136  .name = "mpeg2_vaapi",
137  .type = AVMEDIA_TYPE_VIDEO,
139  .pix_fmt = AV_PIX_FMT_VAAPI_VLD,
140  .start_frame = vaapi_mpeg2_start_frame,
141  .end_frame = ff_vaapi_mpeg_end_frame,
142  .decode_slice = vaapi_mpeg2_decode_slice,
143 };
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
uint16_t chroma_intra_matrix[64]
Definition: mpegvideo.h:473
uint16_t chroma_inter_matrix[64]
Definition: mpegvideo.h:475
HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the b...
Definition: pixfmt.h:126
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
This structure is used to share data between the FFmpeg library and the client video application...
Definition: vaapi.h:50
uint8_t
void * hwaccel_context
Hardware accelerator context.
#define PICT_FRAME
Definition: mpegvideo.h:664
static int mpeg2_get_f_code(MpegEncContext *s)
Reconstruct bitstream f_code.
Definition: vaapi_mpeg2.c:26
int intra_dc_precision
Definition: mpegvideo.h:666
int repeat_first_field
Definition: mpegvideo.h:673
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
uint8_t idct_permutation[64]
idct input permutation.
Definition: dsputil.h:249
void * ff_vaapi_alloc_pic_param(struct vaapi_context *vactx, unsigned int size)
Allocate a new picture parameter buffer.
Definition: vaapi.c:133
int size
static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vaapi_mpeg2.c:38
int intra_vlc_format
Definition: mpegvideo.h:671
int progressive_frame
Definition: mpegvideo.h:682
int top_field_first
Definition: mpegvideo.h:668
const char * name
Name of the hardware accelerated codec.
int alternate_scan
Definition: mpegvideo.h:672
unsigned int slice_param_size
Size of a VASliceParameterBuffer element.
Definition: vaapi.h:137
int mpeg_f_code[2][2]
Definition: mpegvideo.h:659
preferred ID for MPEG-1/2 video decoding
int first_field
is 1 for the first field of a field picture 0 otherwise
Definition: mpegvideo.h:686
int frame_pred_frame_dct
Definition: mpegvideo.h:667
uint16_t inter_matrix[64]
Definition: mpegvideo.h:474
int concealment_motion_vectors
Definition: mpegvideo.h:669
AVHWAccel.
main external API structure.
int height
picture size. must be a multiple of 16
Definition: mpegvideo.h:245
VASliceParameterBufferBase * ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size)
Allocate a new slice descriptor for the input slice.
Definition: vaapi.c:148
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
AVHWAccel ff_mpeg2_vaapi_hwaccel
Definition: vaapi_mpeg2.c:135
static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vaapi_mpeg2.c:101
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:265
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
DSPContext dsp
pointers for accelerated dsp functions
Definition: mpegvideo.h:391
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:306
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:377
static int mpeg2_get_is_frame_start(MpegEncContext *s)
Determine frame start: first field for field picture or frame picture.
Definition: vaapi_mpeg2.c:33
MpegEncContext.
Definition: mpegvideo.h:241
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
Picture last_picture
copy of the previous picture structure.
Definition: mpegvideo.h:325
void * ff_vaapi_alloc_iq_matrix(struct vaapi_context *vactx, unsigned int size)
Allocate a new IQ matrix buffer.
Definition: vaapi.c:138
Bi-dir predicted.
Definition: avutil.h:218
the buffer and buffer 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 AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
static VASurfaceID ff_vaapi_get_surface_id(Picture *pic)
Extract VASurfaceID from a Picture.
int picture_structure
Definition: mpegvideo.h:660
Picture next_picture
copy of the next picture structure.
Definition: mpegvideo.h:331
uint16_t intra_matrix[64]
matrix transmitted in the bitstream
Definition: mpegvideo.h:472
int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx)
Definition: vaapi.c:197
Predicted.
Definition: avutil.h:217
#define av_unused
Definition: attributes.h:114