Go to the documentation of this file.
51 fprintf(stderr,
"Failed to create VAAPI frame context.\n");
61 fprintf(stderr,
"Failed to initialize VAAPI frame context."
83 fprintf(stderr,
"Error code: %s\n",
av_err2str(ret));
92 ret = fwrite(enc_pkt->
data, enc_pkt->
size, 1, fout);
98 ret = ((ret ==
AVERROR(EAGAIN)) ? 0 : -1);
102 int main(
int argc,
char *argv[])
105 FILE *fin = NULL, *fout = NULL;
106 AVFrame *sw_frame = NULL, *hw_frame = NULL;
109 const char *enc_name =
"h264_vaapi";
112 fprintf(stderr,
"Usage: %s <width> <height> <input file> <output file>\n", argv[0]);
116 width = atoi(argv[1]);
120 if (!(fin = fopen(argv[3],
"r"))) {
121 fprintf(stderr,
"Fail to open input file : %s\n", strerror(errno));
124 if (!(fout = fopen(argv[4],
"w+b"))) {
125 fprintf(stderr,
"Fail to open output file : %s\n", strerror(errno));
133 fprintf(stderr,
"Failed to create a VAAPI device. Error code: %s\n",
av_err2str(err));
138 fprintf(stderr,
"Could not find encoder.\n");
157 fprintf(stderr,
"Failed to set hwframe context.\n");
162 fprintf(stderr,
"Cannot open video encoder codec. Error code: %s\n",
av_err2str(err));
177 if ((err = fread((uint8_t*)(sw_frame->
data[0]), size, 1, fin)) <= 0)
179 if ((err = fread((uint8_t*)(sw_frame->
data[1]), size/2, 1, fin)) <= 0)
187 fprintf(stderr,
"Error code: %s.\n",
av_err2str(err));
190 if (!hw_frame->hw_frames_ctx) {
195 fprintf(stderr,
"Error while transferring frame data to surface."
200 if ((err = (
encode_write(avctx, hw_frame, fout))) < 0) {
201 fprintf(stderr,
"Failed to encode.\n");
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
#define AVERROR_EOF
End of file.
uint8_t * data
The data buffer.
static int encode_write(AVCodecContext *avctx, AVFrame *frame, FILE *fout)
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
This structure describes decoded (raw) audio or video data.
int width
The allocated dimensions of the frames in this pool.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, const char *device, AVDictionary *opts, int flags)
Open a device of the specified type and create an AVHWDeviceContext for it.
int main(int argc, char *argv[])
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
static AVBufferRef * hw_device_ctx
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
Rational number (pair of numerator and denominator).
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ctx)
Allocate an AVHWFramesContext tied to a given device context.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
AVCodec * avcodec_find_encoder_by_name(const char *name)
Find a registered encoder with the specified name.
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Supply a raw video or audio frame to the encoder.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags)
Copy data to or from a hw surface.
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
This struct describes a set or pool of "hardware" frames (i.e.
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
main external API structure.
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
int initial_pool_size
Initial size of the frame pool.
A reference to a data buffer.
This structure stores compressed data.
static int set_hwframe_ctx(AVCodecContext *ctx, AVBufferRef *hw_device_ctx)
int width
picture width / height.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.