Esempio n. 1
0
int av_vda_default_init(AVCodecContext *avctx)
{
    avctx->hwaccel_context = av_vda_alloc_context();
    if (!avctx->hwaccel_context)
        return AVERROR(ENOMEM);
    return ff_vda_default_init(avctx);
}
Esempio n. 2
0
File: vda.c Progetto: 0xheart0/vlc
static int Open(vlc_va_t *va,
                AVCodecContext *avctx,
                enum PixelFormat pix_fmt,
                const es_format_t *fmt,
                picture_sys_t *p_sys)
{
    if( pix_fmt != AV_PIX_FMT_VDA )
        return VLC_EGENERIC;

    (void) fmt;
    (void) p_sys;

    size_t i_profile = 0xFFFF, i_level = 0xFFFF;

    switch (avctx->codec_id) {
        case AV_CODEC_ID_H264:
            msg_Dbg( va, "trying to decode MPEG-4 Part 10: profile %d, level %d", avctx->profile, avctx->level);

            switch (avctx->profile & ~FF_PROFILE_H264_INTRA) {
                case FF_PROFILE_H264_CONSTRAINED_BASELINE:
                case FF_PROFILE_H264_BASELINE:
                case FF_PROFILE_H264_MAIN:
                case FF_PROFILE_H264_HIGH:
                    break;

                default:
                    msg_Dbg( va, "unsupported H264 profile %d", avctx->profile);
                    return -1;
            }
            break;

        default:
#ifndef NDEBUG
            msg_Err( va, "codec %d is not supported", avctx->codec_id);
#endif
            return VLC_EGENERIC;
    }

    vlc_va_sys_t *sys = calloc(1, sizeof (*sys));
    if (unlikely(sys == NULL))
        return VLC_ENOMEM;

    sys->vdactx = av_vda_alloc_context();
    sys->vdactx->cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
    sys->i_width = avctx->width;
    sys->i_height = avctx->height;

    int i_ret = av_vda_default_init2(avctx, sys->vdactx);

    msg_Dbg(va, "Creating VDA decoder %i", i_ret);

    if (i_ret != 0) {
        av_vda_default_free(avctx);
        return VLC_EGENERIC;
    }

    va->sys = sys;
    va->description = (char *)"VDA";
    va->get = Get;
    va->release = Release;
    va->extract = Extract;

    return VLC_SUCCESS;
}
Esempio n. 3
0
    if (ret) {
        ret->output_callback = ff_vda_output_callback;
        ret->cv_pix_fmt_type = kCVPixelFormatType_422YpCbCr8;
    }

    return ret;
}

int av_vda_default_init(AVCodecContext *avctx)
{
    return av_vda_default_init2(avctx, NULL);
}

int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx)
{
    avctx->hwaccel_context = vdactx ?: av_vda_alloc_context();
    if (!avctx->hwaccel_context)
        return AVERROR(ENOMEM);
    return ff_vda_default_init(avctx);
}

void av_vda_default_free(AVCodecContext *avctx)
{
    ff_vda_default_free(avctx);
    av_freep(&avctx->hwaccel_context);
}

void ff_vda_default_free(AVCodecContext *avctx)
{
    AVVDAContext *vda = avctx->hwaccel_context;
    if (vda && vda->decoder)
Esempio n. 4
0
File: vda.c Progetto: 9034725985/vlc
static int Open(vlc_va_t *va,
                AVCodecContext *avctx,
                enum PixelFormat pix_fmt,
                const es_format_t *fmt,
                picture_sys_t *p_sys)
{
    if( pix_fmt != AV_PIX_FMT_VDA )
        return VLC_EGENERIC;

    (void) fmt;
    (void) p_sys;
    VLC_UNUSED(avctx);

    size_t i_profile = 0xFFFF, i_level = 0xFFFF;
    bool b_ret = false;

    switch (fmt->i_codec) {
        case VLC_CODEC_H264:
            b_ret = h264_get_profile_level(fmt, &i_profile, &i_level, NULL);
            if (!b_ret) {
                msg_Warn( va, "H264 profile and level parsing failed because it didn't arrive yet");
                return VLC_EGENERIC;
            }

            msg_Dbg( va, "trying to decode MPEG-4 Part 10: profile %zu, level %zu", i_profile, i_level);

            switch (i_profile) {
                case PROFILE_H264_BASELINE:
                case PROFILE_H264_MAIN:
                case PROFILE_H264_HIGH:
                    break;

                default:
                {
                    msg_Dbg( va, "unsupported H264 profile %zu", i_profile);
                    return -1;
                }
            }
            break;

        default:
#ifndef NDEBUG
            msg_Err( va, "'%4.4s' is not supported", (char *)&fmt->i_codec);
#endif
            return VLC_EGENERIC;
            break;
    }

    vlc_va_sys_t *sys = calloc(1, sizeof (*sys));
    if (unlikely(sys == NULL))
        return VLC_ENOMEM;

    sys->vdactx = av_vda_alloc_context();
    sys->vdactx->cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
    sys->i_width = avctx->width;
    sys->i_height = avctx->height;

    va->sys = sys;
    va->description = (char *)"VDA";
    va->setup = Setup;
    va->get = Get;
    va->release = Release;
    va->extract = Extract;

    return VLC_SUCCESS;
}
int videotoolbox_init(AVCodecContext *s)
{
    InputStream *ist = s->opaque;
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
    int ret = 0;
    VTContext *vt;

    vt = av_mallocz(sizeof(*vt));
    if (!vt)
        return AVERROR(ENOMEM);

    ist->hwaccel_ctx           = vt;
    ist->hwaccel_uninit        = videotoolbox_uninit;
    ist->hwaccel_retrieve_data = videotoolbox_retrieve_data;

    vt->tmp_frame = av_frame_alloc();
    if (!vt->tmp_frame) {
        ret = AVERROR(ENOMEM);
        goto fail;
    }

    if (ist->hwaccel_id == HWACCEL_VIDEOTOOLBOX) {
#if CONFIG_VIDEOTOOLBOX
        if (!videotoolbox_pixfmt) {
            ret = av_videotoolbox_default_init(s);
        } else {
            AVVideotoolboxContext *vtctx = av_videotoolbox_alloc_context();
            CFStringRef pixfmt_str = CFStringCreateWithCString(kCFAllocatorDefault,
                                                               videotoolbox_pixfmt,
                                                               kCFStringEncodingUTF8);
            vtctx->cv_pix_fmt_type = UTGetOSTypeFromString(pixfmt_str);
            ret = av_videotoolbox_default_init2(s, vtctx);
            CFRelease(pixfmt_str);
        }
#endif
    } else {
#if CONFIG_VDA
        if (!videotoolbox_pixfmt) {
            ret = av_vda_default_init(s);
        } else {
            AVVDAContext *vdactx = av_vda_alloc_context();
            CFStringRef pixfmt_str = CFStringCreateWithCString(kCFAllocatorDefault,
                                                               videotoolbox_pixfmt,
                                                               kCFStringEncodingUTF8);
            vdactx->cv_pix_fmt_type = UTGetOSTypeFromString(pixfmt_str);
            ret = av_vda_default_init2(s, vdactx);
            CFRelease(pixfmt_str);
        }
#endif
    }
    if (ret < 0) {
        av_log(NULL, loglevel,
               "Error creating %s decoder.\n", ist->hwaccel_id == HWACCEL_VIDEOTOOLBOX ? "Videotoolbox" : "VDA");
        goto fail;
    }

    return 0;
fail:
    videotoolbox_uninit(s);
    return ret;
}