FFmpeg  4.3.7
ffmpeg_qsv.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 <mfx/mfxvideo.h>
20 #include <stdlib.h>
21 
22 #include "libavutil/dict.h"
23 #include "libavutil/hwcontext.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/opt.h"
27 #include "libavcodec/qsv.h"
28 
29 #include "ffmpeg.h"
30 
32 char *qsv_device = NULL;
33 
35 {
36  InputStream *ist = s->opaque;
37 
38  return av_hwframe_get_buffer(ist->hw_frames_ctx, frame, 0);
39 }
40 
42 {
43  InputStream *ist = s->opaque;
45 }
46 
47 static int qsv_device_init(InputStream *ist)
48 {
49  int err;
50  AVDictionary *dict = NULL;
51 
52  if (qsv_device) {
53  err = av_dict_set(&dict, "child_device", qsv_device, 0);
54  if (err < 0)
55  return err;
56  }
57 
58  err = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_QSV,
59  ist->hwaccel_device, dict, 0);
60  if (err < 0) {
61  av_log(NULL, AV_LOG_ERROR, "Error creating a QSV device\n");
62  goto err_out;
63  }
64 
65 err_out:
66  if (dict)
67  av_dict_free(&dict);
68 
69  return err;
70 }
71 
73 {
74  InputStream *ist = s->opaque;
75  AVHWFramesContext *frames_ctx;
76  AVQSVFramesContext *frames_hwctx;
77  int ret;
78 
79  if (!hw_device_ctx) {
80  ret = qsv_device_init(ist);
81  if (ret < 0)
82  return ret;
83  }
84 
86  ist->hw_frames_ctx = av_hwframe_ctx_alloc(hw_device_ctx);
87  if (!ist->hw_frames_ctx)
88  return AVERROR(ENOMEM);
89 
90  frames_ctx = (AVHWFramesContext*)ist->hw_frames_ctx->data;
91  frames_hwctx = frames_ctx->hwctx;
92 
93  frames_ctx->width = FFALIGN(s->coded_width, 32);
94  frames_ctx->height = FFALIGN(s->coded_height, 32);
95  frames_ctx->format = AV_PIX_FMT_QSV;
96  frames_ctx->sw_format = s->sw_pix_fmt;
97  frames_ctx->initial_pool_size = 64 + s->extra_hw_frames;
98  frames_hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET;
99 
101  if (ret < 0) {
102  av_log(NULL, AV_LOG_ERROR, "Error initializing a QSV frame pool\n");
103  return ret;
104  }
105 
107  ist->hwaccel_uninit = qsv_uninit;
108 
109  return 0;
110 }
#define NULL
Definition: coverity.c:32
static AVBufferRef * hw_device_ctx
Definition: ffmpeg_qsv.c:31
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
Definition: buffer.c:125
char * qsv_device
Definition: ffmpeg_qsv.c:32
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
AVBufferRef * hw_frames_ctx
Definition: ffmpeg.h:376
static void qsv_uninit(AVCodecContext *s)
Definition: ffmpeg_qsv.c:41
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:714
int frame_type
A combination of MFX_MEMTYPE_* describing the frame pool.
Definition: hwcontext_qsv.h:49
Memory handling functions.
This struct is allocated as AVHWFramesContext.hwctx.
Definition: hwcontext_qsv.h:42
int width
The allocated dimensions of the frames in this pool.
Definition: hwcontext.h:229
void(* hwaccel_uninit)(AVCodecContext *s)
Definition: ffmpeg.h:371
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:209
Public dictionary API.
AVOptions.
static AVFrame * frame
int av_hwdevice_ctx_create(AVBufferRef **pdevice_ref, enum AVHWDeviceType type, const char *device, AVDictionary *opts, int flags)
Open a device of the specified type and create an AVHWDeviceContext for it.
Definition: hwcontext.c:610
#define FFALIGN(x, a)
Definition: macros.h:48
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define AVERROR(e)
Definition: error.h:43
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
Definition: dict.c:203
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:333
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
Definition: hwcontext.c:502
static int qsv_device_init(InputStream *ist)
Definition: ffmpeg_qsv.c:47
int initial_pool_size
Initial size of the frame pool.
Definition: hwcontext.h:199
int qsv_init(AVCodecContext *s)
Definition: ffmpeg_qsv.c:72
#define s(width, name)
Definition: cbs_vp9.c:257
static int qsv_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
Definition: ffmpeg_qsv.c:34
main external API structure.
Definition: avcodec.h:526
uint8_t * data
The data buffer.
Definition: buffer.h:89
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
Definition: hwcontext.h:162
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
int coded_height
Definition: avcodec.h:714
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:124
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
Definition: pixfmt.h:222
int(* hwaccel_get_buffer)(AVCodecContext *s, AVFrame *frame, int flags)
Definition: ffmpeg.h:372
#define flags(name, subs,...)
Definition: cbs_av1.c:565
A reference to a data buffer.
Definition: buffer.h:81
int extra_hw_frames
Definition: avcodec.h:2328
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:247
char * hwaccel_device
Definition: ffmpeg.h:366
An API-specific header for AV_HWDEVICE_TYPE_QSV.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:222
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:2076
void * opaque
Private data of the user, can be used to carry app specific stuff.
Definition: avcodec.h:568