FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:XvMC

一、文件

xvmc.h

公共libavcodec XvMC头文件。




二、数据结构

struct   xvmc_pix_fmt{

int xvmc_id

该字段包含特殊常数值AV_XVMC_ID。

它被用作应用程序正确使用API的测试,并且没有由像素例程导致的损坏。

应用程序 - 在初始化时设置

libavcodec - 未改变


short * data_blocks

指向由XvMCCreateBlocks()分配的块数组的指针。

数组必须被XvMCDestroyBlocks()释放。 每组64个值表示差分像素信息(以MoCo模式)或IDCT的系数的一个数据块。

应用程序 - 在初始化时设置指针

libavcodec - 将系数/像素数据填充到阵列中


XvMCMacroBlock * mv_blocks

指向由XvMCCreateMacroBlocks()分配的宏块描述数组,并由XvMCDestroyMacroBlocks()释放。

应用程序 - 在初始化时设置指针

libavcodec - 将描述数据填充到数组中


int allocated_mv_blocks

可以存储在mv_blocks数组中的宏块描述数。

应用程序 - 在初始化时设置

libavcodec - 未改变


int allocated_data_blocks

可以在data_blocks数组中一次存储的块数。

应用程序 - 在初始化时设置

libavcodec - 未改变


int idct

表明硬件会将data_block解释为IDCT系数,并对它们执行IDCT。

应用程序 - 在初始化时设置

libavcodec - 未改变


int unsigned_intra

在MoCo模式中,它表示帧内宏块被假定为无符号格式; 与XVMC_INTRA_UNSIGNED标志相同。

应用程序 - 在初始化时设置

libavcodec - 未改变


XvMCSurface * p_surface

指向XvMCCreateSurface()分配的表面的指针。

它必须在应用程序退出时被XvMCDestroySurface()释放。 它识别视频硬件上的帧及其状态。

应用程序 - 在初始化时设置

libavcodec - 未改变


XvMCSurface * p_past_surface

在调用ff_draw_horiz_band()之前由解码器设置,XvMCRenderSurface函数需要。

指向表面的指针用作过去的参考

应用程序 - 未改变

libavcodec - 设置


XvMCSurface * p_future_surface

指向表面用作未来参考。

应用程序 - 未改变

libavcodec - 设置


unsigned int picture_structure

顶部/底部字段或帧。

应用程序 - 未改变

libavcodec - 设置


unsigned int flags

XVMC_SECOND_FIELD - 序列中的第1或第2个字段。

应用程序 - 未改变

libavcodec - 设置


int start_mv_blocks_num

已经传递到硬件的mv_blocks数组中的宏块描述数。

应用程序 - 在get_buffer()上调零。 一个成功的ff_draw_horiz_band()可以用fill_mb_block_num或者二者来增加它们。

libavcodec - 未改变


int filled_mv_blocks_num

mv_blocks数组中的新宏块描述数(在start_mv_blocks_num之后)由libavcodec填充并必须传递到硬件。

应用程序 - 在get_buffer()或ff_draw_horiz_band()成功后将其置零。

libavcodec - 每个存储的MB之一增加

应用程序 - 在get_buffer()或ff_draw_horiz_band()成功后将其置零。

libavcodec - 每个存储的MB之一增加


int next_free_data_block_num

下一个空闲数据块的数量; 一个数据块由data_blocks数组中的64个短值组成。

已经通过将它们的位置放置在相应的块描述结构字段中,这些字段是mv_blocks数组的一部分,已经声明了此前的所有块。

应用程序 - 在在get_buffer()上调零。 成功的ff_draw_horiz_band()可能与start_mb_blocks_num一起归零。

libavcodec - 每个解码的宏块将其包含的编码块的数量增加。

}




三、宏

#define AV_XVMC_ID   0x1DC711C0


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 FFmpeg 进行音视频编解码时,需要注册相应的编解码器。可以通过 avcodec_register_all() 函数来注册 FFmpeg 中所有已经实现的编解码器。 具体步骤如下: 1. 引入头文件 ```c #include <libavcodec/avcodec.h> ``` 2. 注册编解码器 ```c avcodec_register_all(); ``` 3. 查找编解码器 在注册编解码器后,可以通过调用 avcodec_find_encoder() 或 avcodec_find_decoder() 函数来查找特定的编解码器。 例如,查找 H.264 编码器: ```c AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264); if (!codec) { // 没有找到 H.264 编码器 return -1; } ``` 4. 打开编解码器 在找到所需的编解码器后,可以通过调用 avcodec_open2() 函数来打开编解码器。该函数会分配一个 AVCodecContext 结构体,用于存储编解码器相关的信息。 例如,打开 H.264 编码器: ```c AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264); if (!codec) { // 没有找到 H.264 编码器 return -1; } AVCodecContext *codec_ctx = avcodec_alloc_context3(codec); if (!codec_ctx) { // 分配 AVCodecContext 失败 return -1; } // 设置编码参数 codec_ctx->width = width; codec_ctx->height = height; codec_ctx->time_base = (AVRational){1, fps}; codec_ctx->framerate = (AVRational){fps, 1}; // 打开编码器 if (avcodec_open2(codec_ctx, codec, NULL) < 0) { // 打开编码器失败 avcodec_free_context(&codec_ctx); return -1; } ``` 5. 使用编解码器 打开编码器后,就可以使用它进行音视频编解码了。对于编码器,可以通过调用 avcodec_send_frame() 函数发送待编码的帧,然后调用 avcodec_receive_packet() 函数获取编码后的数据包。 例如,使用 H.264 编码器进行视频编码: ```c AVPacket pkt = {0}; // 发送帧 if (avcodec_send_frame(codec_ctx, frame) < 0) { // 发送帧失败 return -1; } // 获取编码后的数据包 while (avcodec_receive_packet(codec_ctx, &pkt) == 0) { // 处理数据包 ... // 释放数据包内存 av_packet_unref(&pkt); } ``` 对于解码器,可以通过调用 avcodec_send_packet() 函数发送待解码的数据包,然后调用 avcodec_receive_frame() 函数获取解码后的帧。 例如,使用 H.264 解码器进行视频解码: ```c AVFrame *frame = av_frame_alloc(); // 发送数据包 if (avcodec_send_packet(codec_ctx, &pkt) < 0) { // 发送数据包失败 return -1; } // 获取解码后的帧 while (avcodec_receive_frame(codec_ctx, frame) == 0) { // 处理帧 ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值