Adding a configure flag to control WebM container support

Adding a --(enable|disable)-webm-io flag to control WebM container input and
output support. For now, enabling WebM IO by default only when there is a C++
compiler. Doing so because eventually we will move WebM IO to libwebm and it
is built using C++.

Change-Id: I210ac36c23528e382ed41d3c4322291720481492
parent 1f08824d
......@@ -51,6 +51,7 @@ Advanced options:
${toggle_postproc_visualizer} macro block / block level visualizers
${toggle_multi_res_encoding} enable multiple-resolution encoding
${toggle_temporal_denoising} enable temporal denoising and disable the spatial denoiser
${toggle_webm_io} enable input from and output to WebM container
Codecs:
Codecs can be selectively enabled or disabled individually, or by family:
......@@ -314,6 +315,7 @@ CONFIG_LIST="
postproc_visualizer
os_support
unit_tests
webm_io
decode_perf_tests
multi_res_encoding
temporal_denoising
......@@ -367,6 +369,7 @@ CMDLINE_SELECT="
small
postproc_visualizer
unit_tests
webm_io
decode_perf_tests
multi_res_encoding
temporal_denoising
......@@ -703,6 +706,9 @@ process_toolchain() {
enabled postproc || die "postproc_visualizer requires postproc to be enabled"
fi
# Enable WebM IO by default.
soft_enable webm_io
# Enable unit tests by default if we have a working C++ compiler.
case "$toolchain" in
*-vs*)
......
......@@ -26,16 +26,18 @@ vpxdec.SRCS += vpx/vpx_integer.h
vpxdec.SRCS += args.c args.h
vpxdec.SRCS += ivfdec.c ivfdec.h
vpxdec.SRCS += tools_common.c tools_common.h
vpxdec.SRCS += webmdec.c webmdec.h
vpxdec.SRCS += y4menc.c y4menc.h
vpxdec.SRCS += third_party/nestegg/halloc/halloc.h
vpxdec.SRCS += third_party/nestegg/halloc/src/align.h
vpxdec.SRCS += third_party/nestegg/halloc/src/halloc.c
vpxdec.SRCS += third_party/nestegg/halloc/src/hlist.h
vpxdec.SRCS += third_party/nestegg/halloc/src/macros.h
vpxdec.SRCS += third_party/nestegg/include/nestegg/nestegg.h
vpxdec.SRCS += third_party/nestegg/src/nestegg.c
vpxdec.SRCS += $(LIBYUV_SRCS)
ifeq ($(CONFIG_WEBM_IO),yes)
vpxdec.SRCS += third_party/nestegg/halloc/halloc.h
vpxdec.SRCS += third_party/nestegg/halloc/src/align.h
vpxdec.SRCS += third_party/nestegg/halloc/src/halloc.c
vpxdec.SRCS += third_party/nestegg/halloc/src/hlist.h
vpxdec.SRCS += third_party/nestegg/halloc/src/macros.h
vpxdec.SRCS += third_party/nestegg/include/nestegg/nestegg.h
vpxdec.SRCS += third_party/nestegg/src/nestegg.c
vpxdec.SRCS += webmdec.c webmdec.h
endif
vpxdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950
vpxdec.DESCRIPTION = Full featured decoder
UTILS-$(CONFIG_ENCODERS) += vpxenc.c
......@@ -45,15 +47,17 @@ vpxenc.SRCS += ivfenc.c ivfenc.h
vpxenc.SRCS += rate_hist.c rate_hist.h
vpxenc.SRCS += tools_common.c tools_common.h
vpxenc.SRCS += warnings.c warnings.h
vpxenc.SRCS += webmenc.c webmenc.h
vpxenc.SRCS += vpx_ports/mem_ops.h
vpxenc.SRCS += vpx_ports/mem_ops_aligned.h
vpxenc.SRCS += vpx_ports/vpx_timer.h
vpxenc.SRCS += vpxstats.c vpxstats.h
vpxenc.SRCS += third_party/libmkv/EbmlIDs.h
vpxenc.SRCS += third_party/libmkv/EbmlWriter.c
vpxenc.SRCS += third_party/libmkv/EbmlWriter.h
vpxenc.SRCS += $(LIBYUV_SRCS)
ifeq ($(CONFIG_WEBM_IO),yes)
vpxenc.SRCS += third_party/libmkv/EbmlIDs.h
vpxenc.SRCS += third_party/libmkv/EbmlWriter.c
vpxenc.SRCS += third_party/libmkv/EbmlWriter.h
vpxenc.SRCS += webmenc.c webmenc.h
endif
vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
vpxenc.DESCRIPTION = Full featured encoder
EXAMPLES-$(CONFIG_VP9_ENCODER) += vp9_spatial_scalable_encoder.c
......
......@@ -218,9 +218,11 @@ static int raw_read_frame(FILE *infile, uint8_t **buffer,
static int read_frame(struct VpxDecInputContext *input, uint8_t **buf,
size_t *bytes_in_buffer, size_t *buffer_size) {
switch (input->vpx_input_ctx->file_type) {
#if CONFIG_WEBM_IO
case FILE_TYPE_WEBM:
return webm_read_frame(input->webm_ctx,
buf, bytes_in_buffer, buffer_size);
#endif
case FILE_TYPE_RAW:
return raw_read_frame(input->vpx_input_ctx->file,
buf, bytes_in_buffer, buffer_size);
......@@ -663,12 +665,17 @@ int main_loop(int argc, const char **argv_) {
input.vpx_input_ctx->file = infile;
if (file_is_ivf(input.vpx_input_ctx))
input.vpx_input_ctx->file_type = FILE_TYPE_IVF;
#if CONFIG_WEBM_IO
else if (file_is_webm(input.webm_ctx, input.vpx_input_ctx))
input.vpx_input_ctx->file_type = FILE_TYPE_WEBM;
#endif
else if (file_is_raw(input.vpx_input_ctx))
input.vpx_input_ctx->file_type = FILE_TYPE_RAW;
else {
fprintf(stderr, "Unrecognized input file type.\n");
#if !CONFIG_WEBM_IO
fprintf(stderr, "vpxdec was built without WebM container support.\n");
#endif
return EXIT_FAILURE;
}
......@@ -691,6 +698,7 @@ int main_loop(int argc, const char **argv_) {
return EXIT_FAILURE;
}
#if CONFIG_WEBM_IO
if (vpx_input_ctx.file_type == FILE_TYPE_WEBM) {
if (webm_guess_framerate(input.webm_ctx, input.vpx_input_ctx)) {
fprintf(stderr, "Failed to guess framerate -- error parsing "
......@@ -698,6 +706,7 @@ int main_loop(int argc, const char **argv_) {
return EXIT_FAILURE;
}
}
#endif
}
fourcc_interface = get_vpx_decoder_by_fourcc(vpx_input_ctx.fourcc);
......@@ -941,9 +950,12 @@ fail:
}
}
#if CONFIG_WEBM_IO
if (input.vpx_input_ctx->file_type == FILE_TYPE_WEBM)
webm_free(input.webm_ctx);
else
#endif
if (input.vpx_input_ctx->file_type != FILE_TYPE_WEBM)
free(buf);
if (scaled_img) vpx_img_free(scaled_img);
......
......@@ -123,6 +123,7 @@ int fourcc_is_ivf(const char detect[4]) {
return 0;
}
#if CONFIG_WEBM_IO
/* Murmur hash derived from public domain reference implementation at
* http:// sites.google.com/site/murmurhash/
*/
......@@ -169,7 +170,7 @@ static unsigned int murmur(const void *key, int len, unsigned int seed) {
return h;
}
#endif // CONFIG_WEBM_IO
static const arg_def_t debugmode = ARG_DEF("D", "debug", 0,
"Debug mode (makes output deterministic)");
......@@ -218,7 +219,7 @@ static const arg_def_t recontest = ARG_DEF_ENUM(NULL, "test-decode", 1,
static const arg_def_t framerate = ARG_DEF(NULL, "fps", 1,
"Stream frame rate (rate/scale)");
static const arg_def_t use_ivf = ARG_DEF(NULL, "ivf", 0,
"Output IVF (default is WebM)");
"Output IVF (default is WebM if WebM IO is enabled)");
static const arg_def_t out_part = ARG_DEF("P", "output-partitions", 0,
"Makes encoder output partitions. Requires IVF output!");
static const arg_def_t q_hist_n = ARG_DEF(NULL, "q-hist", 1,
......@@ -834,7 +835,9 @@ static struct stream_state *new_stream(struct VpxEncoderConfig *global,
/* Initialize remaining stream parameters */
stream->config.stereo_fmt = STEREO_FORMAT_MONO;
stream->config.write_webm = 1;
#if CONFIG_WEBM_IO
stream->ebml.last_pts_ms = -1;
#endif
/* Allows removal of the application version from the EBML tags */
stream->ebml.debug = global->debug;
......@@ -1143,13 +1146,17 @@ static void open_output_file(struct stream_state *stream,
if (stream->config.write_webm && fseek(stream->file, 0, SEEK_CUR))
fatal("WebM output to pipes not supported.");
#if CONFIG_WEBM_IO
if (stream->config.write_webm) {
stream->ebml.stream = stream->file;
write_webm_file_header(&stream->ebml, cfg,
&global->framerate,
stream->config.stereo_fmt,
global->codec->fourcc);
} else {
}
#endif
if (!stream->config.write_webm) {
ivf_write_file_header(stream->file, cfg, global->codec->fourcc, 0);
}
}
......@@ -1162,11 +1169,15 @@ static void close_output_file(struct stream_state *stream,
if (cfg->g_pass == VPX_RC_FIRST_PASS)
return;
#if CONFIG_WEBM_IO
if (stream->config.write_webm) {
write_webm_file_footer(&stream->ebml, stream->hash);
free(stream->ebml.cue_list);
stream->ebml.cue_list = NULL;
} else {
}
#endif
if (!stream->config.write_webm) {
if (!fseek(stream->file, 0, SEEK_SET))
ivf_write_file_header(stream->file, &stream->config.cfg,
fourcc,
......@@ -1316,6 +1327,7 @@ static void get_cx_data(struct stream_state *stream,
fprintf(stderr, " %6luF", (unsigned long)pkt->data.frame.sz);
update_rate_histogram(stream->rate_hist, cfg, pkt);
#if CONFIG_WEBM_IO
if (stream->config.write_webm) {
/* Update the hash */
if (!stream->ebml.debug)
......@@ -1324,7 +1336,9 @@ static void get_cx_data(struct stream_state *stream,
stream->hash);
write_webm_block(&stream->ebml, cfg, pkt);
} else {
}
#endif
if (!stream->config.write_webm) {
if (pkt->data.frame.partition_id <= 0) {
ivf_header_pos = ftello(stream->file);
fsize = pkt->data.frame.sz;
......@@ -1594,6 +1608,14 @@ int main(int argc, const char **argv_) {
" and --passes=2\n", stream->index, global.pass);
});
#if !CONFIG_WEBM_IO
FOREACH_STREAM({
stream->config.write_webm = 0;
warn("vpxenc was compiled without WebM container support."
"Producing IVF output");
});
#endif
/* Use the frame rate from the file only if none was specified
* on the command-line.
*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment