当前位置: 首页 > wzjs >正文

株洲网站建设方案咨询百度小说风云榜总榜

株洲网站建设方案咨询,百度小说风云榜总榜,做章网站,高州女网红遇害案犯罪嫌疑人被抓获RKMPPRGA硬解码 函数说明代码如下 函数说明 调用video_decoder_create_v2函数初始化解码器句柄,完成一系列初始化操作 video_decoder_decode_v2函数将送入的h264_data数据,转成期望的数据格式,并且保存到dst_buff缓冲区 video_decoder_dest…

RKMPP+RGA硬解码

  • 函数说明
  • 代码如下

函数说明

  1. 调用video_decoder_create_v2函数初始化解码器句柄,完成一系列初始化操作

  2. video_decoder_decode_v2函数将送入的h264_data数据,转成期望的数据格式,并且保存到dst_buff缓冲区

  3. video_decoder_destroy_v2销毁解码器句柄,释放内存

  4. 这里以格式BGRA8888为例,dst_buff缓冲区大小至少要dst_w * dst_h * 4,参考RK官方demo代码:mpi_dec_test.c

代码如下

#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <rockchip/rk_mpi.h>
#include <rga/RgaApi.h>#define VDEC_VO_TAG         "vdec_vo.c"typedef struct{// MPP 和 RGA 全局上下文MppCtx mpp_ctx;MppApi *mpi;MppPacket packet;MppDecCfg cfg;MppBufferGroup group;struct _dst_info {int w;int h;int format;int bbp;}dst_info;int start;
}VDEC_VO_PARAMS;int video_decoder_get_frame_v2(void* handle, uint8_t* dst_buff, int size)
{VDEC_VO_PARAMS* vdec_vo_handle = (VDEC_VO_PARAMS*)handle;if (vdec_vo_handle == NULL) return -1;int ret = -1;int retry_times = 2;MppFrame mpp_frame;
try_again:ret = vdec_vo_handle->mpi->decode_get_frame(vdec_vo_handle->mpp_ctx, &mpp_frame);if (MPP_OK != ret || !mpp_frame) {if (retry_times > 0) {retry_times--;msleep(2);goto try_again;}log_Error(VDEC_VO_TAG, "%p decode_get_frame failed too much time\n", vdec_vo_handle->mpp_ctx);}if (ret) {log_Error(VDEC_VO_TAG, "%p decode_get_frame failed ret %d\n", vdec_vo_handle->mpp_ctx, ret);return -1;}//log_Debug(VDEC_VO_TAG, "%s, mpp_frame=%d, ret=%d\n", __func__, mpp_frame != NULL, ret);if (mpp_frame != NULL) {RK_U32 src_width = mpp_frame_get_width(mpp_frame);RK_U32 src_height = mpp_frame_get_height(mpp_frame);RK_U32 src_hor_stride = mpp_frame_get_hor_stride(mpp_frame);RK_U32 src_ver_stride = mpp_frame_get_ver_stride(mpp_frame);RK_U32 buf_size = mpp_frame_get_buf_size(mpp_frame);MppFrameFormat fmt = mpp_frame_get_fmt(mpp_frame);RK_U32 err_info = mpp_frame_get_errinfo(mpp_frame);RK_U32 discard = mpp_frame_get_discard(mpp_frame);RK_U32 frm_oes = mpp_frame_get_discard(mpp_frame);//log_Debug(VDEC_VO_TAG, "%s, Frame format: %d, err_info=%d, discard=%d, frm_oes=%d\n", __func__, fmt, err_info, discard, frm_oes);if (mpp_frame_get_info_change(mpp_frame)) {log_Debug(VDEC_VO_TAG, "%p decode_get_frame get info changed found\n", vdec_vo_handle->mpp_ctx);log_Debug(VDEC_VO_TAG, "%p decoder require buffer w:h [%d:%d] stride [%d:%d] buf_size %d",vdec_vo_handle->mpp_ctx, src_width, src_height, src_hor_stride, src_ver_stride, buf_size);if (NULL == vdec_vo_handle->group) {/* If buffer group is not set create one and limit it */ret = mpp_buffer_group_get_internal(&vdec_vo_handle->group, MPP_BUFFER_TYPE_ION);if (ret) {log_Error(VDEC_VO_TAG, "%p get mpp buffer group failed ret %d\n", vdec_vo_handle->mpp_ctx, ret);}/* Set buffer to mpp decoder */ret = vdec_vo_handle->mpi->control(vdec_vo_handle->mpp_ctx, MPP_DEC_SET_EXT_BUF_GROUP, vdec_vo_handle->group);if (ret) {log_Error(VDEC_VO_TAG, "%p set buffer group failed ret %d\n", vdec_vo_handle->mpp_ctx, ret);}} else {/* If old buffer group exist clear it */ret = mpp_buffer_group_clear(vdec_vo_handle->group);if (ret) {log_Error(VDEC_VO_TAG, "%p clear buffer group failed ret %d\n", vdec_vo_handle->mpp_ctx, ret);}}/* Use limit config to limit buffer count to 24 with buf_size */ret = mpp_buffer_group_limit_config(vdec_vo_handle->group, buf_size, 24);if (ret) {log_Error(VDEC_VO_TAG, "%p limit buffer group failed ret %d\n", vdec_vo_handle->mpp_ctx, ret);}/** All buffer group config done. Set info change ready to let* decoder continue decoding*/ret = vdec_vo_handle->mpi->control(vdec_vo_handle->mpp_ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);if (ret) {log_Error(VDEC_VO_TAG, "%p info change ready failed ret %d\n", vdec_vo_handle->mpp_ctx, ret);}}else {// 获取解码后的 YUV 数据void *yuv_buffer = mpp_frame_get_buffer(mpp_frame);int fd = mpp_buffer_get_fd(yuv_buffer);// RGA 转换:NV12 → dst_formatrga_info_t src = {0,};src.fd = fd;src.mmuFlag = 1;rga_set_rect(&src.rect, 0,0,src_width,src_height,src_hor_stride,src_ver_stride, RK_FORMAT_YCbCr_420_SP);rga_info_t dst = {0,};dst.fd = -1;dst.mmuFlag = 1;dst.virAddr = dst_buff,rga_set_rect(&dst.rect, 0,0,vdec_vo_handle->dst_info.w,vdec_vo_handle->dst_info.h,vdec_vo_handle->dst_info.w,vdec_vo_handle->dst_info.h, vdec_vo_handle->dst_info.format);ret = c_RkRgaBlit(&src, &dst, NULL);if (ret == 0) {} else {log_Error(VDEC_VO_TAG, "c_RkRgaBlit failed ret = %d\n", ret);}ret = 1;}mpp_frame_deinit(&mpp_frame);return ret;}return 0;
}void* video_decoder_create_v2(int disp_w, int disp_h, const char* dst_format)
{VDEC_VO_PARAMS* vdec_vo_handle = (VDEC_VO_PARAMS*)calloc(1, sizeof(VDEC_VO_PARAMS));if(vdec_vo_handle != NULL){int ret = 0;ret = mpp_create(&vdec_vo_handle->mpp_ctx, &vdec_vo_handle->mpi);if(ret) {log_Error(VDEC_VO_TAG, "mpp_create failed! ret=%d\n", ret);free(vdec_vo_handle);return NULL;}MppParam param      = NULL;RK_U32 need_split   = 1;MpiCmd mpi_cmd = MPP_DEC_SET_PARSER_SPLIT_MODE;param = &need_split;ret = vdec_vo_handle->mpi->control(vdec_vo_handle->mpp_ctx, mpi_cmd, param);if (MPP_OK != ret) {log_Error(VDEC_VO_TAG, "%p mpi->control failed\n", vdec_vo_handle->mpp_ctx);mpp_destroy(vdec_vo_handle->mpp_ctx);return NULL;}//ret = vdec_vo_handle->mpi->control(vdec_vo_handle->mpp_ctx, MPP_DEC_SET_ENABLE_DEINTERLACE, (MppParam)0);ret = mpp_init(vdec_vo_handle->mpp_ctx, MPP_CTX_DEC, MPP_VIDEO_CodingAVC);if (ret) {log_Error(VDEC_VO_TAG, "mpp_init failed! ret=%d\n", ret);mpp_destroy(vdec_vo_handle->mpp_ctx);free(vdec_vo_handle);return NULL;}mpp_dec_cfg_init(&vdec_vo_handle->cfg);/** split_parse is to enable mpp internal frame spliter when the input* packet is not aplited into frames.*/ret = mpp_dec_cfg_set_u32(vdec_vo_handle->cfg, "base:split_parse", need_split);if (ret) {log_Error(VDEC_VO_TAG, "%p failed to set split_parse ret %d\n", vdec_vo_handle->mpp_ctx, ret);}ret = vdec_vo_handle->mpi->control(vdec_vo_handle->mpp_ctx, MPP_DEC_SET_CFG, vdec_vo_handle->cfg);if (ret) {log_Error(VDEC_VO_TAG, "%p failed to set cfg %p ret %d\n", vdec_vo_handle->mpp_ctx, vdec_vo_handle->cfg, ret);}ret = mpp_packet_init(&vdec_vo_handle->packet, NULL, 0);vdec_vo_handle->dst_info.w = disp_w;vdec_vo_handle->dst_info.h = disp_h;if (str_eq(dst_format, "BGRA")) {vdec_vo_handle->dst_info.format = RK_FORMAT_BGRA_8888;} else {log_Error(VDEC_VO_TAG, "not support format:%s\n", dst_format);video_decoder_destroy_v2();return NULL;}}log_Info(VDEC_VO_TAG, "%s, vdec_vo_handle:0x%p successfully!\n", __func__, vdec_vo_handle);// 初始化 RGA (程序初始化全局只需要创建一次即可)c_RkRgaInit();return vdec_vo_handle;
}int video_decoder_decode_v2(void* handle, uint8_t* h264_data, int h264_size, int is_key_frame, uint8_t* dst_buff, int dst_size)
{VDEC_VO_PARAMS* vdec_vo_handle = (VDEC_VO_PARAMS*)handle;if (vdec_vo_handle != NULL) {// 这里保证先得到H264关键帧,其实也可以不需要,RKMPP内部自己会解析判断if (is_key_frame) {vdec_vo_handle->start = 1;}if (!vdec_vo_handle->start) {return -1;}int ret = 0;// 复用 packet,仅更新数据mpp_packet_set_data(vdec_vo_handle->packet, h264_data);mpp_packet_set_size(vdec_vo_handle->packet, h264_size);mpp_packet_set_pos(vdec_vo_handle->packet, h264_data);mpp_packet_set_length(vdec_vo_handle->packet, h264_size);if (is_key_frame) {//log_Debug(VDEC_VO_TAG, "%s, is_key_frame\n", __func__);//mpp_packet_set_extra_data(vdec_vo_handle->packet);}/*MppDecQueryCfg query = {0};query.query_flag = MPP_DEC_QUERY_ALL;vdec_vo_handle->mpi->control(vdec_vo_handle->mpp_ctx, MPP_DEC_QUERY, &query);log_Debug(VDEC_VO_TAG, "%s, dec_in_pkt_cnt=%d, dec_hw_run_cnt=%d, dec_out_frm_cnt=%d, rt_bps=%d, rt_fps=%d, rt_status=%d, rt_wait=%d\n", __func__, query.dec_in_pkt_cnt, query.dec_hw_run_cnt, query.dec_out_frm_cnt, query.rt_bps, query.rt_fps, query.rt_status, query.rt_wait);*/// 发送给解码器ret = vdec_vo_handle->mpi->decode_put_packet(vdec_vo_handle->mpp_ctx, vdec_vo_handle->packet);if (ret) {log_Error(VDEC_VO_TAG, "decode_put_packet failed! ret=%d\n", ret);}// 送入数据后就可以立即获取解码后的数据了video_decoder_get_frame_v2(handle, dst_buff, size);return ret;}return -1;
}void video_decoder_destroy_v2(void* handle)
{VDEC_VO_PARAMS* vdec_vo_handle = (VDEC_VO_PARAMS*)handle;if(vdec_vo_handle != NULL){int ret = 0;// 释放资源(循环外!)if (vdec_vo_handle->packet != NULL) {mpp_packet_deinit(&vdec_vo_handle->packet);vdec_vo_handle->packet = NULL;}if (vdec_vo_handle->group != NULL) {mpp_buffer_group_put(vdec_vo_handle->group);vdec_vo_handle->group = NULL;}if (vdec_vo_handle->cfg != NULL) {mpp_dec_cfg_deinit(vdec_vo_handle->cfg);vdec_vo_handle->cfg = NULL;}mpp_destroy(vdec_vo_handle->mpp_ctx);free(vdec_vo_handle);}
}

No pains, no gains.

http://www.dtcms.com/wzjs/107588.html

相关文章:

  • 食品网站开发的背景网络推广是啥
  • 网站存在风险什么意思全渠道营销
  • 网站建设规划任务书宁波seo怎么做推广渠道
  • wordpress 站内消息杭州推广公司排名
  • wordpress 带用户中心百度seo优化系统
  • 网站密码忘记了怎么办百度文库官网登录入口
  • 代理平台有哪些福州短视频seo
  • 自己做的网站怎么放到网上去青岛seo搜索优化
  • 服装 公司 网站建设seo视频教程汇总
  • 陕西省门户网站建设政策沈阳seo排名优化推广
  • 杭州企业展厅设计公司网站优化工具
  • 西安网站建设公百度知道首页网
  • 购物平台有哪些比较火一键优化清理手机
  • 网站租用服务器费用友情链接的英文
  • 北京网站页设计制作创意营销新点子
  • 慈溪电商网站建设公司电商网站推广方案
  • 电子商务网站的定义网络营销自学网站
  • 网站建设管理经验百度搜索下载安装
  • 网站建设 验证码软件推广怎么做
  • 武汉网站开发公司百度客服中心人工在线
  • 淄博网站建设开发线上线下整合营销方案
  • 怎么做微信领券网站百度爱采购
  • 无锡做网站网页设计与制作案例教程
  • 怎么做网站海外推广锦州seo推广
  • 网站设计公司官网什么是网络销售
  • 怎样制作网站seo怎么弄
  • 做pc端网站平台企业管理咨询培训
  • 滕州英文网站建设中国免费网站服务器主机域名
  • 免费域名模板建站免费的seo教程
  • 武汉做网站设计公司南宁seo网络推广