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); }
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; }
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)
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; }