Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos ffmpeg使用来自os x的vda_Macos_Video_Ffmpeg - Fatal编程技术网

Macos ffmpeg使用来自os x的vda

Macos ffmpeg使用来自os x的vda,macos,video,ffmpeg,Macos,Video,Ffmpeg,我尝试启用硬件解码项目,使用ffmpeg进行早期解码 ffmpeg支持硬拷贝解码 这是我做的文件kotoroya 我的代码 enum AVPixelFormat myGetFormatCallback(struct AVCodecContext *ctx, const enum AVPixelFormat * fmt) { struct vda_context *vda_ctx; vda_ctx = (struct vda_context *)malloc(sizeof(vda_

我尝试启用硬件解码项目,使用ffmpeg进行早期解码

ffmpeg支持硬拷贝解码 这是我做的文件kotoroya 我的代码

enum AVPixelFormat myGetFormatCallback(struct AVCodecContext *ctx, const enum AVPixelFormat * fmt)
{
    struct vda_context *vda_ctx;
    vda_ctx = (struct vda_context *)malloc(sizeof(vda_context));
    vda_ctx->decoder = NULL;
    vda_ctx->width = ctx->width;
    vda_ctx->height = ctx->height;
    vda_ctx->format = 'avc1';
    vda_ctx->use_ref_buffer = 1;
    switch (ctx->pix_fmt) {
        case PIX_FMT_UYVY422:{
            vda_ctx->cv_pix_fmt_type = '2vuy';
            break;
        }
        case PIX_FMT_YUYV422:{
            vda_ctx->cv_pix_fmt_type = 'yuvs';
            break;
        }
        case PIX_FMT_NV12:{
            vda_ctx->cv_pix_fmt_type = '420v';
            break;
        }
        case PIX_FMT_YUV420P:{
            vda_ctx->cv_pix_fmt_type = 'y420';
            break;
        }
        default:{
            av_log(ctx, AV_LOG_ERROR, "Unsupported pixel format: %d\n", ctx->pix_fmt);
            Logger::debug(LOG_LEVEL_ERROR, "Unsupported pixel format: %d", ctx->pix_fmt);
            throw AbstractException("Unsupported pixel format");
        }
     }
    int status = ff_vda_create_decoder(vda_ctx, (unsigned char*)ctx->extradata,ctx->extradata_size);
    if (status){
        Logger::debug(LOG_LEVEL_ERROR, "Error create VDA decoder");
        throw AbstractException("Error create VDA decoder");
    }else{
        ctx->hwaccel_context = vda_ctx;
    }

    return ctx->pix_fmt;
}

static void release_vda_context(void *opaque, uint8_t *data)
{
    vda_buffer_context *vda_context = (vda_buffer_context *)opaque;
    av_free(vda_context);
}

int myGetBufferCallback(struct AVCodecContext *s, AVFrame *av_frame, int flags)
{
    vda_buffer_context *vda_context = (vda_buffer_context *)av_mallocz(sizeof(*vda_context));
    AVBufferRef *buffer = av_buffer_create(NULL, 0, release_vda_context, vda_context, 0);

    if( !vda_context || !buffer )
    {
        av_free(vda_context);
        return -1;
    }

    av_frame->buf[0] = buffer;
    av_frame->data[0] = (uint8_t*)1;
    return 0;
}


static void release_buffer(struct AVCodecContext *opaque, AVFrame *pic)
{
    vda_buffer_context *context = (vda_buffer_context*)opaque;
    CVPixelBufferUnlockBaseAddress(context->cv_buffer, 0);
    CVPixelBufferRelease(context->cv_buffer);
    av_free(context);
}

main(){
    //init ff context
    if (avcodec_open2(mCodecContext, mCodec, NULL) < 0) throw AbstractException("Unable to open codec");

    mCodecContext->get_format = myGetFormatCallback;
    mCodecContext->get_buffer2 = myGetBufferCallback;
    mCodecContext->release_buffer = release_buffer;
}
enum AVPixelFormat myGetFormatCallback(结构AVCodecContext*ctx,常量enum AVPixelFormat*fmt)
{
结构vda_上下文*vda_ctx;
vda_ctx=(结构vda_上下文*)malloc(sizeof(vda_上下文));
vda_ctx->解码器=NULL;
vda_ctx->宽度=ctx->宽度;
vda_ctx->高度=ctx->高度;
vda_ctx->格式='avc1';
vda_ctx->使用_ref_buffer=1;
开关(ctx->pix\U fmt){
案例PIX_FMT_UYVY422:{
vda_ctx->cv_pix_fmt_类型='2vuy';
打破
}
案例PIX_FMT_YUYV422:{
vda_ctx->cv_pix_fmt_类型='yuvs';
打破
}
案例PIX_FMT_NV12:{
vda_ctx->cv_pix_fmt_类型='420v';
打破
}
案例PIX_FMT_YUV420P:{
vda_ctx->cv_pix_fmt_类型='y420';
打破
}
默认值:{
av_日志(ctx,av_日志错误,“不支持的像素格式:%d\n”,ctx->pix_fmt);
记录器::调试(日志级别错误,“不支持的像素格式:%d”,ctx->pix\U fmt);
抛出AbstractException(“不支持的像素格式”);
}
}
int status=ff_vda_create_解码器(vda_ctx,(无符号字符*)ctx->extradata,ctx->extradata_大小);
如果(状态){
记录器::调试(日志级错误,“错误创建VDA解码器”);
抛出AbstractException(“错误创建VDA解码器”);
}否则{
ctx->hwaccel_context=vda_ctx;
}
返回ctx->pix\U fmt;
}
静态void release_vda_上下文(void*不透明,uint8_t*数据)
{
vda_buffer_context*vda_context=(vda_buffer_context*)不透明;
av_免费(vda_上下文);
}
int myGetBufferCallback(结构AVCODEContext*s、AVFrame*av_frame、int标志)
{
vda_buffer_context*vda_context=(vda_buffer_context*)av_mallocz(sizeof(*vda_context));
AVBufferRef*buffer=av_buffer_create(NULL,0,release_vda_context,vda_context,0);
如果(!vda|U上下文| |!缓冲区)
{
av_免费(vda_上下文);
返回-1;
}
av_帧->buf[0]=缓冲区;
av_帧->数据[0]=(uint8_t*)1;
返回0;
}
静态void release_缓冲区(struct AVCodecContext*不透明,AVFrame*pic)
{
vda_buffer_context*context=(vda_buffer_context*)不透明;
CVPixelBufferUnlockBaseAddress(上下文->cv_缓冲区,0);
CVPixelBufferRelease(上下文->cv_缓冲区);
av_免费(上下文);
}
main(){
//初始化ff上下文
if(avcodec_open2(mCodecContext,mCodec,NULL)<0)抛出AbstractException(“无法打开编解码器”);
mCodecContext->get_format=myGetFormatCallback;
mCodecContext->get_buffer2=myGetBufferCallback;
mCodecContext->release\u buffer=release\u buffer;
}
但是我没有调用myGetFormatCallback方法,而是调用myGetBufferCallback方法
为什么不调用myGetFormatCallback?怎么了?可能根本不起作用

您的问题解决了吗?我正在努力实现同样的目标。我可以叫我的GetFormatCallback。但后来我看到了一个撞击。问题似乎在MyGetBufferCallback中我没有我没有使用ffmpeg。我用简单的视频解码加速