建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

tracycw

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-20 16:04:49 2354 7 楼主 显示全部楼层
[需求建议] 视频解码的时候,每次解码出来的数据不一样

能否帮忙看下这段代码哪有问题吗?有时候能解码成功,有时候解码不出来

// call vpc and get yuv image

void CallVpcGetYuvImage(FRAME *frame, void *hiai_data)

{

    HIAI_ENGINE_LOG(HIAI_IDE_ERROR, "CallVpcGetYuvImage");


    if (frame == nullptr || hiai_data == nullptr)

    {

        HIAI_ENGINE_LOG(HIAI_IDE_ERROR, "The input data for function:CallVpcGetYuvImage is nullptr!");

        return;

    }


    // constructing input image configuration

    std::shared_ptr<VpcUserImageConfigure> image_configure(new (nothrow) VpcUserImageConfigure);

    if (image_configure.get() == nullptr)

    {

        return;

    }


    int aligned_output_width = ALIGN_UP(frame->width, 128);

    int aligned_output_height = ALIGN_UP(frame->height, 16);

    image_configure->widthStride = aligned_output_width;

    image_configure->heightStride = aligned_output_height;

    image_configure->inputFormat = INPUT_YUV420_SEMI_PLANNER_UV;

    image_configure->outputFormat = OUTPUT_YUV420SP_UV;

    image_configure->isCompressData = true;

    image_configure->compressDataConfigure.lumaHeadAddr = (long)(frame->buffer + frame->offset_head_y);

    image_configure->compressDataConfigure.chromaHeadAddr = (long)(frame->buffer + frame->offset_head_c);

    image_configure->compressDataConfigure.lumaHeadStride = frame->stride_head;

    image_configure->compressDataConfigure.chromaHeadStride = frame->stride_head;

    image_configure->compressDataConfigure.lumaPayloadAddr = (long)(frame->buffer + frame->offset_payload_y);

    image_configure->compressDataConfigure.chromaPayloadAddr = (long)(frame->buffer + frame->offset_payload_c);

    image_configure->compressDataConfigure.lumaPayloadStride = frame->stride_payload;

    image_configure->compressDataConfigure.chromaPayloadStride = frame->stride_payload;


    std::shared_ptr<VpcUserRoiConfigure> roi_configure(new (nothrow) VpcUserRoiConfigure);

    if (roi_configure.get() == nullptr)

    {

        HIAI_ENGINE_LOG(HIAI_IDE_ERROR, "Fail to new memory when initialize vpc user roi configure!");

        return;

    }

    roi_configure->next = nullptr;


    VpcUserRoiInputConfigure *input_configure = &roi_configure->inputConfigure;

    input_configure->cropArea.leftOffset = 0;

    input_configure->cropArea.rightOffset = frame->width % 2 == 0 ? frame->width - 1 : frame->width;

    input_configure->cropArea.upOffset = 0;

    input_configure->cropArea.downOffset = frame->height % 2 == 0 ? frame->height - 1 : frame->height;


    int vpc_output_size = aligned_output_width * aligned_output_height * 3 / 2;

    if (vpc_output_size <= 0 || vpc_output_size > 67108864)

    {

        HIAI_ENGINE_LOG(HIAI_IDE_ERROR, "The vpc_output_size:%d is invalid! value range: 1~67108864", vpc_output_size);

        return;

    }


    // constructing output roi configuration

    pobj = (HiaiDataSpSon*) hiai_data;

    VpcUserRoiOutputConfigure* output_configure = &roi_configure->outputConfigure;

    output_configure->addr = (uint8_t*)pobj->getFrameBuffer();

    output_configure->bufferSize = vpc_output_size;

    output_configure->widthStride = aligned_output_width;

    output_configure->heightStride = aligned_output_height;

    output_configure->outputArea.leftOffset = 0; 

    output_configure->outputArea.rightOffset = frame->width % 2 == 0 ? frame->width - 1 : frame->width;

    output_configure->outputArea.upOffset = 0;

    output_configure->outputArea.downOffset = frame->height % 2 == 0 ? frame->height - 1 : frame->height;


    image_configure->roiConfigure = roi_configure.get();


    dvppapi_ctl_msg dvpp_api_ctl_msg;

    dvpp_api_ctl_msg.in = static_cast<void *>(image_configure.get());

    dvpp_api_ctl_msg.in_size = sizeof(VpcUserImageConfigure);


    // call vpc and check the result

    if (DvppCtl(dvpp_api, DVPP_CTL_VPC_PROC, &dvpp_api_ctl_msg) != 0)

    {

        HIAI_ENGINE_LOG(HIAI_IDE_ERROR, "Fail to call dvppctl VPC!");

        return;

    }


    return;

}


// convert video to hfbc

bool VideoDecode::ConvertVideoFrameToHfbc(std::shared_ptr<ObjectResultVecT>& frame)

{

    for (int i = 0; i < frame->b_img.v_img.size(); ++i)

    {

        hiai_data_->setFrameBuffer(vdec_data_[i]);

        hiai_data_->setFrameSize(vdec_data_size_);

        // hiai_data_->channel_name_ = "channel";

        // hiai_data_->channel_id_ = "1";

        

        vdec_msg_.hiai_data_sp = hiai_data_;

        vdec_msg_.call_back = CallVpcGetYuvImage;

        // vdec_msg_.channelId = 0;


        dvppapi_ctl_msg dvppApiCtlMsg;

        dvppApiCtlMsg.in = (void *)((&vdec_msg_));

        dvppApiCtlMsg.in_size = sizeof(vdec_in_msg);


        vdec_msg_.in_buffer = (char *)frame->b_img.v_img[i].img.data.get();

        vdec_msg_.in_buffer_size = frame->b_img.v_img[i].img.size;


        // call vdec and check result

        if (0 != VdecCtl(vdec_handle_, DVPP_CTL_VDEC_PROC, &dvppApiCtlMsg, 0))

        {

            HIAI_ENGINE_LOG(HIAI_IDE_ERROR, "Fail to call dvppctl process");

            return false;

        }


        frame->b_img.v_img[i].img.width = ALIGN_UP(frame->b_img.v_img[i].img.width, 128);

        frame->b_img.v_img[i].img.height = ALIGN_UP(frame->b_img.v_img[i].img.height, 16);

        frame->b_img.v_img[i].img.data.reset(vdec_data_[i], [](uint8_t* ptr){});    // 解码出来的data不一样

        frame->b_img.v_img[i].img.size = vdec_data_size_;

    }

    

    return true;

}


举报
分享

分享文章到朋友圈

分享文章到微博

windyxyz

发帖: 5粉丝: 5

级别 : 中级会员

Rank: 3Rank: 3

发消息 + 关注

发表于2019-9-20 20:07:55 沙发 显示全部楼层
点赞 引用 举报

tracycw

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-23 10:54:56 板凳 显示全部楼层
回复:windyxyz 发表于 2019-9-20 20:07 你好,解码失败 看下log日志呢?https://ascend.huawei.com/doc/Atlas%20200%20DK/1.3.0.0/zh/zh-cn

原视频解码出来应该是这样的


有的帧会解码成这样

有的会这样

点赞 引用 举报

tracycw

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-23 11:07:47 地板 显示全部楼层
回复:windyxyz 发表于 2019-9-20 20:07 你好,解码失败 看下log日志呢?https://ascend.huawei.com/doc/Atlas%20200%20DK/1.3.0.0/zh/zh-cn

日志文件没啥问题,解码没有提示什么错误,但是解码出来的图片有问题

点赞 引用 举报

windyxyz

发帖: 5粉丝: 5

级别 : 中级会员

Rank: 3Rank: 3

发消息 + 关注

发表于2019-9-23 11:30:37 5# 显示全部楼层

20190923-114524(eSpace).png


你好,另外你用的是什么形态的设备,altas200DK,还是300,500?

点赞 引用 举报

tracycw

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-23 11:45:13 6# 显示全部楼层
回复:windyxyz 发表于 2019-9-23 11:30 你好,如果方便的话,把工程放上来,我运行看下呢?像帧数据错位了。

image.png

利用ffmpeg解码得到每帧数据指针和大小,传到Decode引擎解码,解码之后的数据保存成图片


video_decode.rar 5 KB,下载次数:5

点赞 引用 举报

_xyt

发帖: 1粉丝: 1

级别 : 中级会员

Rank: 3Rank: 3

发消息 + 关注

发表于2019-9-23 11:46:29 7# 显示全部楼层
回复:tracycw 发表于 2019-9-23 10:54 原视频解码出来应该是这样的有的帧会解码成这样有的会这样

你好,我之前有遇到过类似的问题,我在转jpeg格式时没有把is_align_image设置成true,图片显示效果是花屏,轮廓都看不出来。

is_align_image

bool

输入图像是否已经128字节对齐,默认未对齐

true:已对齐

false:未对齐

所以你这里是不是没有把图片设置对齐呢,可以参考一下dvpp的相关接口https://ascend.huawei.com/doc/Atlas%20200%20DK/1.3.0.0/zh/zh-cn_topic_0166134744.html 希望对你有帮助

点赞 引用 举报

tracycw

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-23 11:54:58 8# 显示全部楼层
回复:windyxyz 发表于 2019-9-23 11:30 你好,另外你用的是什么形态的设备,altas200DK,还是300,500?

Atlas 300

image.png

点赞 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册