FFmpeg  4.0
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 
31 char *qsv_device = NULL;
32 
34 {
35  InputStream *ist = s->opaque;
36 
37  return av_hwframe_get_buffer(ist->hw_frames_ctx, frame, 0);
38 }
39 
41 {
42  InputStream *ist = s->opaque;
44 }
45 
46 static int qsv_device_init(InputStream *ist)
47 {
48  int err;
49  AVDictionary *dict = NULL;
50 
51  if (qsv_device) {
52  err = av_dict_set(&dict, "child_device", qsv_device, 0);
53  if (err < 0)
54  return err;
55  }
56 
58  ist->hwaccel_device, dict, 0);
59  if (err < 0) {
60  av_log(NULL, AV_LOG_ERROR, "Error creating a QSV device\n");
61  goto err_out;
62  }
63 
64 err_out:
65  if (dict)
66  av_dict_free(&dict);
67 
68  return err;
69 }
70 
72 {
73  InputStream *ist = s->opaque;
74  AVHWFramesContext *frames_ctx;
75  AVQSVFramesContext *frames_hwctx;
76  int ret;
77 
78  if (!hw_device_ctx) {
79  ret = qsv_device_init(ist);
80  if (ret < 0)
81  return ret;
82  }
83 
86  if (!ist->hw_frames_ctx)
87  return AVERROR(ENOMEM);
88 
89  frames_ctx = (AVHWFramesContext*)ist->hw_frames_ctx->data;
90  frames_hwctx = frames_ctx->hwctx;
91 
92  frames_ctx->width = FFALIGN(s->coded_width, 32);
93  frames_ctx->height = FFALIGN(s->coded_height, 32);
94  frames_ctx->format = AV_PIX_FMT_QSV;
95  frames_ctx->sw_format = s->sw_pix_fmt;
96  frames_ctx->initial_pool_size = 64;
97  frames_hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET;
98 
100  if (ret < 0) {
101  av_log(NULL, AV_LOG_ERROR, "Error initializing a QSV frame pool\n");
102  return ret;
103  }
104 
106  ist->hwaccel_uninit = qsv_uninit;
107 
108  return 0;
109 }
#define NULL
Definition: coverity.c:32
const char * s
Definition: avisynth_c.h:768
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:31
This structure describes decoded (raw) audio or video data.
Definition: frame.h:218
AVBufferRef * hw_frames_ctx
Definition: ffmpeg.h:376
static void qsv_uninit(AVCodecContext *s)
Definition: ffmpeg_qsv.c:40
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:1705
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:228
void(* hwaccel_uninit)(AVCodecContext *s)
Definition: ffmpeg.h:371
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:208
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:571
static int flags
Definition: log.c:55
#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
static AVBufferRef * hw_device_ctx
Definition: hw_decode.c:43
#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:329
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
Definition: hwcontext.c:465
static int qsv_device_init(InputStream *ist)
Definition: ffmpeg_qsv.c:46
int initial_pool_size
Initial size of the frame pool.
Definition: hwcontext.h:198
int qsv_init(AVCodecContext *s)
Definition: ffmpeg_qsv.c:71
static int qsv_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
Definition: ffmpeg_qsv.c:33
main external API structure.
Definition: avcodec.h:1518
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:161
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:1705
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:123
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
Definition: pixfmt.h:218
int(* hwaccel_get_buffer)(AVCodecContext *s, AVFrame *frame, int flags)
Definition: ffmpeg.h:372
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:243
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:221
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:3047
void * opaque
Private data of the user, can be used to carry app specific stuff.
Definition: avcodec.h:1560