static void CloseEncoder( vlc_object_t *p_this ) { encoder_t *p_enc = (encoder_t *)p_this; encoder_sys_t *p_sys = p_enc->p_sys; daala_info_clear(&p_sys->di); daala_comment_clear(&p_sys->dc); daala_encode_free(p_sys->dcx); free( p_sys ); }
static void destructor(void *arg) { struct videnc_state *ves = arg; if (ves->stats.valid) dump_stats(ves); if (ves->enc) daala_encode_free(ves->enc); }
int daala_encode_update(struct videnc_state **vesp, const struct vidcodec *vc, struct videnc_param *prm, const char *fmtp, videnc_packet_h *pkth, void *arg) { struct videnc_state *ves; (void)fmtp; if (!vesp || !vc || !prm || prm->pktsize < 3 || !pkth) return EINVAL; ves = *vesp; if (!ves) { ves = mem_zalloc(sizeof(*ves), destructor); if (!ves) return ENOMEM; *vesp = ves; } else { if (ves->enc && (ves->bitrate != prm->bitrate || ves->pktsize != prm->pktsize || ves->fps != prm->fps)) { info("daala: encoder: params changed\n"); daala_encode_free(ves->enc); ves->enc = NULL; } } ves->bitrate = prm->bitrate; ves->pktsize = prm->pktsize; ves->fps = prm->fps; ves->pkth = pkth; ves->arg = arg; return 0; }
void teardown(void) { daala_encode_free(dd); }
static int open_encoder(struct videnc_state *ves, const struct vidsz *size) { daala_info di; daala_comment dc; daala_packet dp; int err = 0; int complexity = 7; int video_q = 30; int bitrate = ves->bitrate; info("daala: open encoder (%d x %d, %d bps)\n", size->w, size->h, bitrate); if (ves->enc) { debug("daala: re-opening encoder\n"); daala_encode_free(ves->enc); } daala_info_init(&di); daala_comment_init(&dc); di.pic_width = size->w; di.pic_height = size->h; di.timebase_numerator = 1; di.timebase_denominator = ves->fps; di.frame_duration = 1; di.pixel_aspect_numerator = -1; di.pixel_aspect_denominator = -1; di.nplanes = 3; di.plane_info[0].xdec = 0; /* YUV420P */ di.plane_info[0].ydec = 0; di.plane_info[1].xdec = 1; di.plane_info[1].ydec = 1; di.plane_info[2].xdec = 1; di.plane_info[2].ydec = 1; di.keyframe_rate = 100; info("daala: open encoder with bitstream version %u.%u.%u\n", di.version_major, di.version_minor, di.version_sub); ves->enc = daala_encode_create(&di); if (!ves->enc) { warning("daala: failed to open DAALA encoder\n"); return ENOMEM; } daala_encode_ctl(ves->enc, OD_SET_QUANT, &video_q, sizeof(video_q)); daala_encode_ctl(ves->enc, OD_SET_COMPLEXITY, &complexity, sizeof(complexity)); daala_encode_ctl(ves->enc, OD_SET_BITRATE, &bitrate, sizeof(bitrate)); for (;;) { int r; r = daala_encode_flush_header(ves->enc, &dc, &dp); if (r < 0) { warning("daala: flush_header returned %d\n", r); break; } else if (r == 0) break; debug("daala: header: %lld bytes header=%d key=%d\n", dp.bytes, daala_packet_isheader(&dp), daala_packet_iskeyframe(&dp)); #if 0 re_printf("bos=%lld, eos=%lld, granule=%lld, packetno=%lld\n", dp.b_o_s, dp.e_o_s, dp.granulepos, dp.packetno); #endif err = send_packet(ves, dp.b_o_s, dp.packet, dp.bytes); if (err) break; } daala_info_clear(&di); daala_comment_clear(&dc); return err; }