FFmpeg  4.0
nvdec_mpeg12.c
Go to the documentation of this file.
1 /*
2  * MPEG-1/2 HW decode acceleration through NVDEC
3  *
4  * Copyright (c) 2017 Philip Langdale
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 "avcodec.h"
24 #include "mpegvideo.h"
25 #include "nvdec.h"
26 #include "decode.h"
27 
28 static int nvdec_mpeg12_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
29 {
30  MpegEncContext *s = avctx->priv_data;
31 
33  CUVIDPICPARAMS *pp = &ctx->pic_params;
34  CUVIDMPEG2PICPARAMS *ppc = &pp->CodecSpecific.mpeg2;
35  FrameDecodeData *fdd;
36  NVDECFrame *cf;
37  AVFrame *cur_frame = s->current_picture.f;
38 
39  int ret, i;
40 
41  ret = ff_nvdec_start_frame(avctx, cur_frame);
42  if (ret < 0)
43  return ret;
44 
45  fdd = (FrameDecodeData*)cur_frame->private_ref->data;
46  cf = (NVDECFrame*)fdd->hwaccel_priv;
47 
48  *pp = (CUVIDPICPARAMS) {
49  .PicWidthInMbs = (cur_frame->width + 15) / 16,
50  .FrameHeightInMbs = (cur_frame->height + 15) / 16,
51  .CurrPicIdx = cf->idx,
52 
53  .intra_pic_flag = s->pict_type == AV_PICTURE_TYPE_I,
54  .ref_pic_flag = s->pict_type == AV_PICTURE_TYPE_I ||
56 
57  .CodecSpecific.mpeg2 = {
58  .ForwardRefIdx = ff_nvdec_get_ref_idx(s->last_picture.f),
59  .BackwardRefIdx = ff_nvdec_get_ref_idx(s->next_picture.f),
60 
61  .picture_coding_type = s->pict_type,
62  .full_pel_forward_vector = s->full_pel[0],
63  .full_pel_backward_vector = s->full_pel[1],
64  .f_code = { { s->mpeg_f_code[0][0],
65  s->mpeg_f_code[0][1] },
66  { s->mpeg_f_code[1][0],
67  s->mpeg_f_code[1][1] } },
68  .intra_dc_precision = s->intra_dc_precision,
69  .frame_pred_frame_dct = s->frame_pred_frame_dct,
70  .concealment_motion_vectors = s->concealment_motion_vectors,
71  .q_scale_type = s->q_scale_type,
72  .intra_vlc_format = s->intra_vlc_format,
73  .alternate_scan = s->alternate_scan,
74  .top_field_first = s->top_field_first,
75  }
76  };
77 
78  for (i = 0; i < 64; ++i) {
79  ppc->QuantMatrixIntra[i] = s->intra_matrix[i];
80  ppc->QuantMatrixInter[i] = s->inter_matrix[i];
81  }
82 
83  return 0;
84 }
85 
87  AVBufferRef *hw_frames_ctx)
88 {
89  // Each frame can at most have one P and one B reference
90  return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2);
91 }
92 
93 #if CONFIG_MPEG2_NVDEC_HWACCEL
95  .name = "mpeg2_nvdec",
96  .type = AVMEDIA_TYPE_VIDEO,
98  .pix_fmt = AV_PIX_FMT_CUDA,
99  .start_frame = nvdec_mpeg12_start_frame,
100  .end_frame = ff_nvdec_simple_end_frame,
101  .decode_slice = ff_nvdec_simple_decode_slice,
102  .frame_params = nvdec_mpeg12_frame_params,
103  .init = ff_nvdec_decode_init,
104  .uninit = ff_nvdec_decode_uninit,
105  .priv_data_size = sizeof(NVDECContext),
106 };
107 #endif
108 
109 #if CONFIG_MPEG1_NVDEC_HWACCEL
111  .name = "mpeg1_nvdec",
112  .type = AVMEDIA_TYPE_VIDEO,
114  .pix_fmt = AV_PIX_FMT_CUDA,
115  .start_frame = nvdec_mpeg12_start_frame,
116  .end_frame = ff_nvdec_simple_end_frame,
117  .decode_slice = ff_nvdec_simple_decode_slice,
118  .frame_params = nvdec_mpeg12_frame_params,
119  .init = ff_nvdec_decode_init,
120  .uninit = ff_nvdec_decode_uninit,
121  .priv_data_size = sizeof(NVDECContext),
122 };
123 #endif
const char * s
Definition: avisynth_c.h:768
int size
This structure describes decoded (raw) audio or video data.
Definition: frame.h:218
mpegvideo header.
int ff_nvdec_simple_end_frame(AVCodecContext *avctx)
Definition: nvdec.c:494
static char buffer[20]
Definition: seek.c:32
uint8_t
CUVIDPICPARAMS pic_params
Definition: nvdec.h:51
AVBufferRef * private_ref
AVBufferRef for internal use by a single libav* library.
Definition: frame.h:596
int ff_nvdec_simple_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: nvdec.c:502
int full_pel[2]
Definition: mpegvideo.h:489
Picture current_picture
copy of the current picture structure.
Definition: mpegvideo.h:180
int intra_dc_precision
Definition: mpegvideo.h:463
static int nvdec_mpeg12_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: nvdec_mpeg12.c:86
int width
Definition: frame.h:276
int ff_nvdec_start_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: nvdec.c:418
unsigned int idx
Definition: nvdec.h:45
int ff_nvdec_decode_init(AVCodecContext *avctx)
Definition: nvdec.c:264
int intra_vlc_format
Definition: mpegvideo.h:469
int ff_nvdec_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx, int dpb_size)
Definition: nvdec.c:524
int top_field_first
Definition: mpegvideo.h:465
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:3582
int alternate_scan
Definition: mpegvideo.h:470
AVFormatContext * ctx
Definition: movenc.c:48
int mpeg_f_code[2][2]
Definition: mpegvideo.h:457
HW acceleration through CUDA.
Definition: pixfmt.h:231
preferred ID for MPEG-1/2 video decoding
Definition: avcodec.h:220
int frame_pred_frame_dct
Definition: mpegvideo.h:464
uint16_t inter_matrix[64]
Definition: mpegvideo.h:302
int concealment_motion_vectors
Definition: mpegvideo.h:466
Libavcodec external API header.
main external API structure.
Definition: avcodec.h:1518
int ff_nvdec_decode_uninit(AVCodecContext *avctx)
Definition: nvdec.c:246
uint8_t * data
The data buffer.
Definition: buffer.h:89
struct AVFrame * f
Definition: mpegpicture.h:46
const AVHWAccel ff_mpeg1_nvdec_hwaccel
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:212
MpegEncContext.
Definition: mpegvideo.h:81
A reference to a data buffer.
Definition: buffer.h:81
This struct stores per-frame lavc-internal data and is attached to it via private_ref.
Definition: decode.h:34
int ff_nvdec_get_ref_idx(AVFrame *frame)
Definition: nvdec.c:570
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:190
Picture last_picture
copy of the previous picture structure.
Definition: mpegvideo.h:162
void * priv_data
Definition: avcodec.h:1545
const AVHWAccel ff_mpeg2_nvdec_hwaccel
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:1553
Picture next_picture
copy of the next picture structure.
Definition: mpegvideo.h:168
int height
Definition: frame.h:276
static int nvdec_mpeg12_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: nvdec_mpeg12.c:28
uint16_t intra_matrix[64]
matrix transmitted in the bitstream
Definition: mpegvideo.h:300
void * hwaccel_priv
Per-frame private data for hwaccels.
Definition: decode.h:52
Predicted.
Definition: avutil.h:275