Skip to content

Commit

Permalink
vpxenc: Add support for pixel aspect ratio.
Browse files Browse the repository at this point in the history
WebM files will adjust the display width and height according to the
input pixel aspect ratio. The default pixel aspect ratio is 1:1.

BUG=https://code.google.com/p/webm/issues/detail?id=1005

Change-Id: I23e0a601b7259fa9513cb86110c41b8437769808
  • Loading branch information
Frank Galligan committed Jun 5, 2015
1 parent 8710cce commit 09acd26
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 7 deletions.
1 change: 1 addition & 0 deletions test/test-data.mk
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_420.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_422.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_444.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_440.yuv
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_420_a10-1.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_420.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_422.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_444.y4m
Expand Down
1 change: 1 addition & 0 deletions test/test-data.sha1
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ c934da6fb8cc54ee2a8c17c54cf6076dac37ead0 *park_joy_90p_10_440.yuv
c92825f1ea25c5c37855083a69faac6ac4641a9e *park_joy_90p_12_422.y4m
b592189b885b6cc85db55cc98512a197d73d3b34 *park_joy_90p_12_444.y4m
82c1bfcca368c2f22bad7d693d690d5499ecdd11 *park_joy_90p_12_440.yuv
b9e1e90aece2be6e2c90d89e6ab2372d5f8c792d *park_joy_90p_8_420_a10-1.y4m
4e0eb61e76f0684188d9bc9f3ce61f6b6b77bb2c *park_joy_90p_8_420.y4m
7a193ff7dfeb96ba5f82b2afd7afa9e1fe83d947 *park_joy_90p_8_422.y4m
bdb7856e6bc93599bdda05c2e773a9f22b6c6d03 *park_joy_90p_8_444.y4m
Expand Down
5 changes: 4 additions & 1 deletion test/tools_common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,8 @@ YUV_RAW_INPUT="${LIBVPX_TEST_DATA_PATH}/hantro_collage_w352h288.yuv"
YUV_RAW_INPUT_WIDTH=352
YUV_RAW_INPUT_HEIGHT=288

Y4M_NOSQ_PAR_INPUT="${LIBVPX_TEST_DATA_PATH}/park_joy_90p_8_420_a10-1.y4m"

# Setup a trap function to clean up after tests complete.
trap cleanup EXIT

Expand All @@ -429,6 +431,7 @@ vlog "$(basename "${0%.*}") test configuration:
VPX_TEST_VERBOSE_OUTPUT=${VPX_TEST_VERBOSE_OUTPUT}
YUV_RAW_INPUT=${YUV_RAW_INPUT}
YUV_RAW_INPUT_WIDTH=${YUV_RAW_INPUT_WIDTH}
YUV_RAW_INPUT_HEIGHT=${YUV_RAW_INPUT_HEIGHT}"
YUV_RAW_INPUT_HEIGHT=${YUV_RAW_INPUT_HEIGHT}
Y4M_NOSQ_PAR_INPUT=${Y4M_NOSQ_PAR_INPUT}"

fi # End $VPX_TEST_TOOLS_COMMON_SH pseudo include guard.
31 changes: 30 additions & 1 deletion test/vpxenc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ vpxenc_verify_environment() {
elog "The file ${YUV_RAW_INPUT##*/} must exist in LIBVPX_TEST_DATA_PATH."
return 1
fi
if [ "$(vpxenc_can_encode_vp9)" = "yes" ]; then
if [ ! -e "${Y4M_NOSQ_PAR_INPUT}" ]; then
elog "The file ${Y4M_NOSQ_PAR_INPUT##*/} must exist in"
elog "LIBVPX_TEST_DATA_PATH."
return 1
fi
fi
if [ -z "$(vpx_tool_path vpxenc)" ]; then
elog "vpxenc not found. It must exist in LIBVPX_BIN_PATH or its parent."
return 1
Expand All @@ -49,6 +56,10 @@ yuv_input_hantro_collage() {
--height="${YUV_RAW_INPUT_HEIGHT}""
}

y4m_input_non_square_par() {
echo ""${Y4M_NOSQ_PAR_INPUT}""
}

# Echo default vpxenc real time encoding params. $1 is the codec, which defaults
# to vp8 if unspecified.
vpxenc_rt_params() {
Expand Down Expand Up @@ -320,6 +331,23 @@ vpxenc_vp9_webm_lag10_frames20() {
fi
}

# TODO(fgalligan): Test that DisplayWidth is different than video width.
vpxenc_vp9_webm_non_square_par() {
if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \
[ "$(webm_io_available)" = "yes" ]; then
local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_non_square_par.webm"
vpxenc $(y4m_input_non_square_par) \
--codec=vp9 \
--limit="${TEST_FRAMES}" \
--output="${output}"

if [ ! -e "${output}" ]; then
elog "Output file does not exist."
return 1
fi
fi
}

vpxenc_tests="vpxenc_vp8_ivf
vpxenc_vp8_webm
vpxenc_vp8_webm_rt
Expand All @@ -332,6 +360,7 @@ vpxenc_tests="vpxenc_vp8_ivf
vpxenc_vp9_webm_2pass
vpxenc_vp9_ivf_lossless
vpxenc_vp9_ivf_minq0_maxq0
vpxenc_vp9_webm_lag10_frames20"
vpxenc_vp9_webm_lag10_frames20
vpxenc_vp9_webm_non_square_par"

run_tests vpxenc_verify_environment "${vpxenc_tests}"
1 change: 1 addition & 0 deletions tools_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ struct VpxInputContext {
enum VideoFileType file_type;
uint32_t width;
uint32_t height;
struct VpxRational pixel_aspect_ratio;
vpx_img_fmt_t fmt;
vpx_bit_depth_t bit_depth;
int only_i420;
Expand Down
15 changes: 12 additions & 3 deletions vpxenc.c
Original file line number Diff line number Diff line change
Expand Up @@ -944,6 +944,10 @@ static void open_input_file(struct VpxInputContext *input) {
rewind(input->file);
}

/* Default to 1:1 pixel aspect ratio. */
input->pixel_aspect_ratio.numerator = 1;
input->pixel_aspect_ratio.denominator = 1;

/* For RAW input sources, these bytes will applied on the first frame
* in read_frame().
*/
Expand All @@ -957,6 +961,8 @@ static void open_input_file(struct VpxInputContext *input) {
input->file_type = FILE_TYPE_Y4M;
input->width = input->y4m.pic_w;
input->height = input->y4m.pic_h;
input->pixel_aspect_ratio.numerator = input->y4m.par_n;
input->pixel_aspect_ratio.denominator = input->y4m.par_d;
input->framerate.numerator = input->y4m.fps_n;
input->framerate.denominator = input->y4m.fps_d;
input->fmt = input->y4m.vpx_fmt;
Expand Down Expand Up @@ -1390,7 +1396,8 @@ static void show_stream_config(struct stream_state *stream,


static void open_output_file(struct stream_state *stream,
struct VpxEncoderConfig *global) {
struct VpxEncoderConfig *global,
const struct VpxRational *pixel_aspect_ratio) {
const char *fn = stream->config.out_fn;
const struct vpx_codec_enc_cfg *const cfg = &stream->config.cfg;

Expand All @@ -1411,7 +1418,8 @@ static void open_output_file(struct stream_state *stream,
write_webm_file_header(&stream->ebml, cfg,
&global->framerate,
stream->config.stereo_fmt,
global->codec->fourcc);
global->codec->fourcc,
pixel_aspect_ratio);
}
#endif

Expand Down Expand Up @@ -2044,7 +2052,8 @@ int main(int argc, const char **argv_) {
}

FOREACH_STREAM(setup_pass(stream, &global, pass));
FOREACH_STREAM(open_output_file(stream, &global));
FOREACH_STREAM(open_output_file(stream, &global,
&input.pixel_aspect_ratio));
FOREACH_STREAM(initialize_encoder(stream, &global));

#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
Expand Down
12 changes: 11 additions & 1 deletion webmenc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ void write_webm_file_header(struct EbmlGlobal *glob,
const vpx_codec_enc_cfg_t *cfg,
const struct vpx_rational *fps,
stereo_format_t stereo_fmt,
unsigned int fourcc) {
unsigned int fourcc,
const struct VpxRational *par) {
mkvmuxer::MkvWriter *const writer = new mkvmuxer::MkvWriter(glob->stream);
mkvmuxer::Segment *const segment = new mkvmuxer::Segment();
segment->Init(writer);
Expand All @@ -49,6 +50,15 @@ void write_webm_file_header(struct EbmlGlobal *glob,
segment->GetTrackByNumber(video_track_id));
video_track->SetStereoMode(stereo_fmt);
video_track->set_codec_id(fourcc == VP8_FOURCC ? "V_VP8" : "V_VP9");
if (par->numerator > 1 || par->denominator > 1) {
// TODO(fgalligan): Add support of DisplayUnit, Display Aspect Ratio type
// to WebM format.
const uint64_t display_width =
static_cast<uint64_t>(((cfg->g_w * par->numerator * 1.0) /
par->denominator) + .5);
video_track->set_display_width(display_width);
video_track->set_display_height(cfg->g_h);
}
if (glob->debug) {
video_track->set_uid(kDebugTrackUid);
}
Expand Down
3 changes: 2 additions & 1 deletion webmenc.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ void write_webm_file_header(struct EbmlGlobal *glob,
const vpx_codec_enc_cfg_t *cfg,
const struct vpx_rational *fps,
stereo_format_t stereo_fmt,
unsigned int fourcc);
unsigned int fourcc,
const struct VpxRational *par);

void write_webm_block(struct EbmlGlobal *glob,
const vpx_codec_enc_cfg_t *cfg,
Expand Down

0 comments on commit 09acd26

Please sign in to comment.