static void enc_preprocess(MSFilter* f) { EncData *d=(EncData*)f->data; d->packer=rfc3984_new(); rfc3984_set_mode(d->packer,d->mode); rfc3984_enable_stap_a(d->packer,FALSE); ms_video_starter_init(&d->starter); AMediaCodec *codec; codec = AMediaCodec_createEncoderByType("video/avc"); d->codec = codec; AMediaFormat *format = AMediaFormat_new(); AMediaFormat_setString(format, "mime", "video/avc"); AMediaFormat_setInt32(format, "width", d->vconf.vsize.width); AMediaFormat_setInt32(format, "height", d->vconf.vsize.height); AMediaFormat_setInt32(format, "i-frame-interval", 20); AMediaFormat_setInt32(format, "color-format", 19); AMediaFormat_setInt32(format, "bitrate", d->vconf.required_bitrate); AMediaFormat_setInt32(format, "frame-rate", d->vconf.fps); AMediaFormat_setInt32(format, "bitrate-mode",1); media_status_t status = AMediaCodec_configure(d->codec, format, NULL, NULL, AMEDIACODEC_CONFIGURE_FLAG_ENCODE); if(status != 0){ d->isYUV = FALSE; AMediaFormat_setInt32(format, "color-format", 21); AMediaCodec_configure(d->codec, format, NULL, NULL, AMEDIACODEC_CONFIGURE_FLAG_ENCODE); } AMediaCodec_start(d->codec); AMediaFormat_delete(format); }
static void enc_preprocess(MSFilter *f) { EncState *s = (EncState *)f->data; vpx_codec_err_t res; vpx_codec_caps_t caps; int cpuused=0; /* Populate encoder configuration */ s->flags = 0; caps = vpx_codec_get_caps(s->iface); if ((s->avpf_enabled == TRUE) && (caps & VPX_CODEC_CAP_OUTPUT_PARTITION)) { s->flags |= VPX_CODEC_USE_OUTPUT_PARTITION; } res = vpx_codec_enc_config_default(s->iface, &s->cfg, 0); if (res) { ms_error("Failed to get config: %s", vpx_codec_err_to_string(res)); return; } s->cfg.rc_target_bitrate = (unsigned int)(((float)s->vconf.required_bitrate) * 0.92f / 1024.0f); //0.92=take into account IP/UDP/RTP overhead, in average. s->cfg.g_pass = VPX_RC_ONE_PASS; /* -p 1 */ s->cfg.g_timebase.num = 1; s->cfg.g_timebase.den = (int)s->vconf.fps; s->cfg.rc_end_usage = VPX_CBR; /* --end-usage=cbr */ if (s->avpf_enabled == TRUE) { s->cfg.kf_mode = VPX_KF_DISABLED; } else { s->cfg.kf_mode = VPX_KF_AUTO; /* encoder automatically places keyframes */ s->cfg.kf_max_dist = 10 * s->cfg.g_timebase.den; /* 1 keyframe each 10s. */ } #if TARGET_IPHONE_SIMULATOR s->cfg.g_threads = 1; /*workaround to remove crash on ipad simulator*/ #else s->cfg.g_threads = ms_factory_get_cpu_count(f->factory); #endif ms_message("VP8 g_threads=%d", s->cfg.g_threads); s->cfg.rc_undershoot_pct = 95; /* --undershoot-pct=95 */ s->cfg.g_error_resilient = VPX_ERROR_RESILIENT_DEFAULT|VPX_ERROR_RESILIENT_PARTITIONS; s->cfg.g_lag_in_frames = 0; #if defined(ANDROID) || (TARGET_OS_IPHONE == 1) || defined(__arm__) || defined(_M_ARM) cpuused = 10 - s->cfg.g_threads; /*cpu/quality tradeoff: positive values decrease CPU usage at the expense of quality*/ if (cpuused < 7) cpuused = 7; /*values beneath 7 consume too much CPU*/ if( s->cfg.g_threads == 1 ){ /* on mono-core iOS devices, we reduce the quality a bit more due to VP8 being slower with new Clang compilers */ cpuused = 16; } #endif s->cfg.g_w = s->vconf.vsize.width; s->cfg.g_h = s->vconf.vsize.height; /* Initialize codec */ res = vpx_codec_enc_init(&s->codec, s->iface, &s->cfg, s->flags); if (res) { ms_error("vpx_codec_enc_init failed: %s (%s)", vpx_codec_err_to_string(res), vpx_codec_error_detail(&s->codec)); return; } vpx_codec_control(&s->codec, VP8E_SET_CPUUSED, cpuused); vpx_codec_control(&s->codec, VP8E_SET_STATIC_THRESHOLD, 0); vpx_codec_control(&s->codec, VP8E_SET_ENABLEAUTOALTREF, !s->avpf_enabled); vpx_codec_control(&s->codec, VP8E_SET_MAX_INTRA_BITRATE_PCT, 400); /*limite iFrame size to 4 pframe*/ if (s->flags & VPX_CODEC_USE_OUTPUT_PARTITION) { vpx_codec_control(&s->codec, VP8E_SET_TOKEN_PARTITIONS, 2); /* Output 4 partitions per frame */ } else { vpx_codec_control(&s->codec, VP8E_SET_TOKEN_PARTITIONS, 0); } s->invalid_frame_reported = FALSE; vp8rtpfmt_packer_init(&s->packer); if (s->avpf_enabled == TRUE) { s->force_keyframe = TRUE; } else if (s->frame_count == 0) { ms_video_starter_init(&s->starter); } s->ready = TRUE; }
static void h264_enc_preprocess(MSFilter *f) { VTH264EncCtx *ctx = (VTH264EncCtx *)f->data; h264_enc_configure(ctx); ms_video_starter_init(&ctx->starter); ctx->first_frame = TRUE; }