int aml_setup(int videoFormat, int width, int height, int redrawRate, void* context, int drFlags) { codecParam.stream_type = STREAM_TYPE_ES_VIDEO; codecParam.has_video = 1; codecParam.noblock = 0; codecParam.am_sysinfo.param = 0; switch (videoFormat) { case VIDEO_FORMAT_H264: if (width > 1920 || height > 1080) { codecParam.video_type = VFORMAT_H264_4K2K; codecParam.am_sysinfo.format = VIDEO_DEC_FORMAT_H264_4K2K; } else { codecParam.video_type = VFORMAT_H264; codecParam.am_sysinfo.format = VIDEO_DEC_FORMAT_H264; // Workaround for decoding special case of C1, 1080p, H264 int major, minor; struct utsname name; uname(&name); int ret = sscanf(name.release, "%d.%d", &major, &minor); if (!(major > 3 || (major == 3 && minor >= 14)) && width == 1920 && height == 1080) codecParam.am_sysinfo.param = (void*) UCODE_IP_ONLY_PARAM; } break; case VIDEO_FORMAT_H265: codecParam.video_type = VFORMAT_HEVC; codecParam.am_sysinfo.format = VIDEO_DEC_FORMAT_HEVC; break; default: printf("Video format not supported\n"); return -1; } codecParam.am_sysinfo.width = width; codecParam.am_sysinfo.height = height; codecParam.am_sysinfo.rate = 96000 / redrawRate; codecParam.am_sysinfo.param = (void*) ((size_t) codecParam.am_sysinfo.param | SYNC_OUTSIDE); int ret; if ((ret = codec_init(&codecParam)) != 0) { fprintf(stderr, "codec_init error: %x\n", ret); return -2; } if ((ret = codec_set_freerun_mode(&codecParam, 1)) != 0) { fprintf(stderr, "Can't set Freerun mode: %x\n", ret); return -2; } return 0; }
static int stream_es_init(play_para_t *p_para) { v_stream_info_t *vinfo = &p_para->vstream_info; a_stream_info_t *ainfo = &p_para->astream_info; s_stream_info_t *sinfo = &p_para->sstream_info; codec_para_t *v_codec = NULL, *a_codec = NULL, *s_codec = NULL; int ret = CODEC_ERROR_NONE; if (vinfo->has_video) { v_codec = codec_alloc(); if (!v_codec) { return PLAYER_EMPTY_P; } MEMSET(v_codec, 0, sizeof(codec_para_t)); vcodec_info_init(p_para, v_codec); ret = codec_init(v_codec); if (ret != CODEC_ERROR_NONE) { if (ret != CODEC_OPEN_HANDLE_FAILED) { codec_close(v_codec); } goto error1; } p_para->vcodec = v_codec; } if (ainfo->has_audio) { a_codec = codec_alloc(); if (!a_codec) { if (vinfo->has_video && v_codec) { codec_release(v_codec); } return PLAYER_EMPTY_P; } MEMSET(a_codec, 0, sizeof(codec_para_t)); acodec_info_init(p_para, a_codec); ret = codec_init(a_codec); if (ret != CODEC_ERROR_NONE) { if (ret != CODEC_OPEN_HANDLE_FAILED) { codec_close(a_codec); } goto error2; } p_para->acodec = a_codec; } if (!p_para->vcodec && !p_para->acodec) { log_print("[stream_es_init] no audio and no video codec init!\n"); return DECODER_INIT_FAILED; } if (sinfo->has_sub) { s_codec = codec_alloc(); if (!s_codec) { if (vinfo->has_video && v_codec) { codec_release(v_codec); } if (ainfo->has_audio && a_codec) { codec_release(a_codec); } return PLAYER_EMPTY_P; } MEMSET(s_codec, 0, sizeof(codec_para_t)); scodec_info_init(p_para, s_codec); if (codec_init(s_codec) != 0) { goto error3; } p_para->scodec = s_codec; } if (v_codec) { codec_set_freerun_mode(v_codec, p_para->playctrl_info.freerun_mode); codec_set_vsync_upint(v_codec, p_para->playctrl_info.vsync_upint); } return PLAYER_SUCCESS; error1: codec_free(v_codec); return DECODER_INIT_FAILED; error2: if (vinfo->has_video && v_codec) { codec_release(v_codec); } codec_free(a_codec); return DECODER_INIT_FAILED; error3: if (vinfo->has_video && v_codec) { codec_release(v_codec); } if (ainfo->has_audio && a_codec) { codec_release(a_codec); } codec_free(s_codec); return DECODER_INIT_FAILED; }