Add hdr_util.
Move the Colour element utility functions out of sample_muxer and into a place where they can be utilized by libwebm users. Change-Id: I7e2bfd02d6f4aa4f26fb0d0a697cb68e20698655
This commit is contained in:
@@ -31,6 +31,8 @@ set(GTEST_BUILD_DIR "${CMAKE_BINARY_DIR}/googletest_build")
|
|||||||
|
|
||||||
# Libwebm section.
|
# Libwebm section.
|
||||||
add_library(webm STATIC
|
add_library(webm STATIC
|
||||||
|
"${LIBWEBM_SRC_DIR}/hdr_util.cpp"
|
||||||
|
"${LIBWEBM_SRC_DIR}/hdr_util.hpp"
|
||||||
"${LIBWEBM_SRC_DIR}/mkvmuxer.cpp"
|
"${LIBWEBM_SRC_DIR}/mkvmuxer.cpp"
|
||||||
"${LIBWEBM_SRC_DIR}/mkvmuxer.hpp"
|
"${LIBWEBM_SRC_DIR}/mkvmuxer.hpp"
|
||||||
"${LIBWEBM_SRC_DIR}/mkvmuxertypes.hpp"
|
"${LIBWEBM_SRC_DIR}/mkvmuxertypes.hpp"
|
||||||
|
@@ -3,6 +3,7 @@ CXXFLAGS := -W -Wall -g -MMD -MP
|
|||||||
LIBWEBMA := libwebm.a
|
LIBWEBMA := libwebm.a
|
||||||
LIBWEBMSO := libwebm.so
|
LIBWEBMSO := libwebm.so
|
||||||
WEBMOBJS := mkvparser.o mkvreader.o mkvmuxer.o mkvmuxerutil.o mkvwriter.o
|
WEBMOBJS := mkvparser.o mkvreader.o mkvmuxer.o mkvmuxerutil.o mkvwriter.o
|
||||||
|
WEBMOBJS += hdr_util.o
|
||||||
OBJSA := $(WEBMOBJS:.o=_a.o)
|
OBJSA := $(WEBMOBJS:.o=_a.o)
|
||||||
OBJSSO := $(WEBMOBJS:.o=_so.o)
|
OBJSSO := $(WEBMOBJS:.o=_so.o)
|
||||||
OBJECTS1 := sample.o
|
OBJECTS1 := sample.o
|
||||||
|
107
hdr_util.cpp
Normal file
107
hdr_util.cpp
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
// Copyright (c) 2016 The WebM project authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license
|
||||||
|
// that can be found in the LICENSE file in the root of the source
|
||||||
|
// tree. An additional intellectual property rights grant can be found
|
||||||
|
// in the file PATENTS. All contributing project authors may
|
||||||
|
// be found in the AUTHORS file in the root of the source tree.
|
||||||
|
#include "hdr_util.hpp"
|
||||||
|
|
||||||
|
namespace libwebm {
|
||||||
|
bool CopyPrimaryChromaticity(const mkvparser::PrimaryChromaticity& parser_pc,
|
||||||
|
PrimaryChromaticityPtr* muxer_pc) {
|
||||||
|
muxer_pc->reset(new (std::nothrow)
|
||||||
|
mkvmuxer::PrimaryChromaticity(parser_pc.x, parser_pc.y));
|
||||||
|
if (!muxer_pc->get())
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MasteringMetadataValuePresent(double value) {
|
||||||
|
return value != mkvparser::MasteringMetadata::kValueNotPresent;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CopyMasteringMetadata(const mkvparser::MasteringMetadata& parser_mm,
|
||||||
|
mkvmuxer::MasteringMetadata* muxer_mm) {
|
||||||
|
if (MasteringMetadataValuePresent(parser_mm.luminance_max))
|
||||||
|
muxer_mm->luminance_max = parser_mm.luminance_max;
|
||||||
|
if (MasteringMetadataValuePresent(parser_mm.luminance_min))
|
||||||
|
muxer_mm->luminance_min = parser_mm.luminance_min;
|
||||||
|
|
||||||
|
PrimaryChromaticityPtr r_ptr(NULL);
|
||||||
|
PrimaryChromaticityPtr g_ptr(NULL);
|
||||||
|
PrimaryChromaticityPtr b_ptr(NULL);
|
||||||
|
PrimaryChromaticityPtr wp_ptr(NULL);
|
||||||
|
|
||||||
|
if (parser_mm.r) {
|
||||||
|
if (!CopyPrimaryChromaticity(*parser_mm.r, &r_ptr))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (parser_mm.g) {
|
||||||
|
if (!CopyPrimaryChromaticity(*parser_mm.g, &g_ptr))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (parser_mm.b) {
|
||||||
|
if (!CopyPrimaryChromaticity(*parser_mm.b, &b_ptr))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (parser_mm.white_point) {
|
||||||
|
if (!CopyPrimaryChromaticity(*parser_mm.white_point, &wp_ptr))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!muxer_mm->SetChromaticity(r_ptr.get(), g_ptr.get(), b_ptr.get(),
|
||||||
|
wp_ptr.get())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ColourValuePresent(long long value) {
|
||||||
|
return value != mkvparser::Colour::kValueNotPresent;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CopyColour(const mkvparser::Colour& parser_colour,
|
||||||
|
mkvmuxer::Colour* muxer_colour) {
|
||||||
|
if (!muxer_colour)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (ColourValuePresent(parser_colour.matrix_coefficients))
|
||||||
|
muxer_colour->matrix_coefficients = parser_colour.matrix_coefficients;
|
||||||
|
if (ColourValuePresent(parser_colour.bits_per_channel))
|
||||||
|
muxer_colour->bits_per_channel = parser_colour.bits_per_channel;
|
||||||
|
if (ColourValuePresent(parser_colour.chroma_subsampling_horz))
|
||||||
|
muxer_colour->chroma_subsampling_horz =
|
||||||
|
parser_colour.chroma_subsampling_horz;
|
||||||
|
if (ColourValuePresent(parser_colour.chroma_subsampling_vert))
|
||||||
|
muxer_colour->chroma_subsampling_vert =
|
||||||
|
parser_colour.chroma_subsampling_vert;
|
||||||
|
if (ColourValuePresent(parser_colour.cb_subsampling_horz))
|
||||||
|
muxer_colour->cb_subsampling_horz = parser_colour.cb_subsampling_horz;
|
||||||
|
if (ColourValuePresent(parser_colour.cb_subsampling_vert))
|
||||||
|
muxer_colour->cb_subsampling_vert = parser_colour.cb_subsampling_vert;
|
||||||
|
if (ColourValuePresent(parser_colour.chroma_siting_horz))
|
||||||
|
muxer_colour->chroma_siting_horz = parser_colour.chroma_siting_horz;
|
||||||
|
if (ColourValuePresent(parser_colour.chroma_siting_vert))
|
||||||
|
muxer_colour->chroma_siting_vert = parser_colour.chroma_siting_vert;
|
||||||
|
if (ColourValuePresent(parser_colour.range))
|
||||||
|
muxer_colour->range = parser_colour.range;
|
||||||
|
if (ColourValuePresent(parser_colour.transfer_characteristics))
|
||||||
|
muxer_colour->transfer_characteristics =
|
||||||
|
parser_colour.transfer_characteristics;
|
||||||
|
if (ColourValuePresent(parser_colour.primaries))
|
||||||
|
muxer_colour->primaries = parser_colour.primaries;
|
||||||
|
if (ColourValuePresent(parser_colour.max_cll))
|
||||||
|
muxer_colour->max_cll = parser_colour.max_cll;
|
||||||
|
if (ColourValuePresent(parser_colour.max_fall))
|
||||||
|
muxer_colour->max_fall = parser_colour.max_fall;
|
||||||
|
|
||||||
|
if (parser_colour.mastering_metadata) {
|
||||||
|
mkvmuxer::MasteringMetadata muxer_mm;
|
||||||
|
if (!CopyMasteringMetadata(*parser_colour.mastering_metadata, &muxer_mm))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} // namespace libwebm
|
42
hdr_util.hpp
Normal file
42
hdr_util.hpp
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (c) 2016 The WebM project authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license
|
||||||
|
// that can be found in the LICENSE file in the root of the source
|
||||||
|
// tree. An additional intellectual property rights grant can be found
|
||||||
|
// in the file PATENTS. All contributing project authors may
|
||||||
|
// be found in the AUTHORS file in the root of the source tree.
|
||||||
|
#ifndef LIBWEBM_HDR_UTIL_H_
|
||||||
|
#define LIBWEBM_HDR_UTIL_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "mkvmuxer.hpp"
|
||||||
|
#include "mkvparser.hpp"
|
||||||
|
|
||||||
|
namespace libwebm {
|
||||||
|
|
||||||
|
// Utility types and functions for working with the Colour element and its
|
||||||
|
// children. Copiers return true upon success. Presence functions return true
|
||||||
|
// when the specified element is present.
|
||||||
|
|
||||||
|
// TODO(tomfinegan): These should be moved to libwebm_utils once c++11 is
|
||||||
|
// required by libwebm.
|
||||||
|
|
||||||
|
typedef std::auto_ptr<mkvmuxer::PrimaryChromaticity> PrimaryChromaticityPtr;
|
||||||
|
|
||||||
|
bool CopyPrimaryChromaticity(const mkvparser::PrimaryChromaticity& parser_pc,
|
||||||
|
PrimaryChromaticityPtr* muxer_pc);
|
||||||
|
|
||||||
|
bool MasteringMetadataValuePresent(double value);
|
||||||
|
|
||||||
|
bool CopyMasteringMetadata(const mkvparser::MasteringMetadata& parser_mm,
|
||||||
|
mkvmuxer::MasteringMetadata* muxer_mm);
|
||||||
|
|
||||||
|
bool ColourValuePresent(long long value);
|
||||||
|
|
||||||
|
bool CopyColour(const mkvparser::Colour& parser_colour,
|
||||||
|
mkvmuxer::Colour* muxer_colour);
|
||||||
|
|
||||||
|
} // namespace libwebm
|
||||||
|
|
||||||
|
#endif // LIBWEBM_HDR_UTIL_H_
|
103
sample_muxer.cpp
103
sample_muxer.cpp
@@ -13,6 +13,9 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
// libwebm common includes.
|
||||||
|
#include "hdr_util.hpp"
|
||||||
|
|
||||||
// libwebm parser includes
|
// libwebm parser includes
|
||||||
#include "mkvparser.hpp"
|
#include "mkvparser.hpp"
|
||||||
#include "mkvreader.hpp"
|
#include "mkvreader.hpp"
|
||||||
@@ -141,104 +144,6 @@ int ParseArgWebVTT(char* argv[], int* argv_index, int argc_check,
|
|||||||
return 0; // not a WebVTT arg
|
return 0; // not a WebVTT arg
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::auto_ptr<mkvmuxer::PrimaryChromaticity> PrimaryChromaticityPtr;
|
|
||||||
bool CopyPrimaryChromaticity(const mkvparser::PrimaryChromaticity& parser_pc,
|
|
||||||
PrimaryChromaticityPtr* muxer_pc) {
|
|
||||||
muxer_pc->reset(new (std::nothrow)
|
|
||||||
mkvmuxer::PrimaryChromaticity(parser_pc.x, parser_pc.y));
|
|
||||||
if (!muxer_pc->get())
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MasteringMetadataValuePresent(double value) {
|
|
||||||
return value != mkvparser::MasteringMetadata::kValueNotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CopyMasteringMetadata(const mkvparser::MasteringMetadata& parser_mm,
|
|
||||||
mkvmuxer::MasteringMetadata* muxer_mm) {
|
|
||||||
if (MasteringMetadataValuePresent(parser_mm.luminance_max))
|
|
||||||
muxer_mm->luminance_max = parser_mm.luminance_max;
|
|
||||||
if (MasteringMetadataValuePresent(parser_mm.luminance_min))
|
|
||||||
muxer_mm->luminance_min = parser_mm.luminance_min;
|
|
||||||
|
|
||||||
PrimaryChromaticityPtr r_ptr(NULL);
|
|
||||||
PrimaryChromaticityPtr g_ptr(NULL);
|
|
||||||
PrimaryChromaticityPtr b_ptr(NULL);
|
|
||||||
PrimaryChromaticityPtr wp_ptr(NULL);
|
|
||||||
|
|
||||||
if (parser_mm.r) {
|
|
||||||
if (!CopyPrimaryChromaticity(*parser_mm.r, &r_ptr))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (parser_mm.g) {
|
|
||||||
if (!CopyPrimaryChromaticity(*parser_mm.g, &g_ptr))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (parser_mm.b) {
|
|
||||||
if (!CopyPrimaryChromaticity(*parser_mm.b, &b_ptr))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (parser_mm.white_point) {
|
|
||||||
if (!CopyPrimaryChromaticity(*parser_mm.white_point, &wp_ptr))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!muxer_mm->SetChromaticity(r_ptr.get(), g_ptr.get(), b_ptr.get(),
|
|
||||||
wp_ptr.get())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ColourValuePresent(long long value) {
|
|
||||||
return value != mkvparser::Colour::kValueNotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CopyColour(const mkvparser::Colour& parser_colour,
|
|
||||||
mkvmuxer::Colour* muxer_colour) {
|
|
||||||
if (!muxer_colour)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (ColourValuePresent(parser_colour.matrix_coefficients))
|
|
||||||
muxer_colour->matrix_coefficients = parser_colour.matrix_coefficients;
|
|
||||||
if (ColourValuePresent(parser_colour.bits_per_channel))
|
|
||||||
muxer_colour->bits_per_channel = parser_colour.bits_per_channel;
|
|
||||||
if (ColourValuePresent(parser_colour.chroma_subsampling_horz))
|
|
||||||
muxer_colour->chroma_subsampling_horz =
|
|
||||||
parser_colour.chroma_subsampling_horz;
|
|
||||||
if (ColourValuePresent(parser_colour.chroma_subsampling_vert))
|
|
||||||
muxer_colour->chroma_subsampling_vert =
|
|
||||||
parser_colour.chroma_subsampling_vert;
|
|
||||||
if (ColourValuePresent(parser_colour.cb_subsampling_horz))
|
|
||||||
muxer_colour->cb_subsampling_horz = parser_colour.cb_subsampling_horz;
|
|
||||||
if (ColourValuePresent(parser_colour.cb_subsampling_vert))
|
|
||||||
muxer_colour->cb_subsampling_vert = parser_colour.cb_subsampling_vert;
|
|
||||||
if (ColourValuePresent(parser_colour.chroma_siting_horz))
|
|
||||||
muxer_colour->chroma_siting_horz = parser_colour.chroma_siting_horz;
|
|
||||||
if (ColourValuePresent(parser_colour.chroma_siting_vert))
|
|
||||||
muxer_colour->chroma_siting_vert = parser_colour.chroma_siting_vert;
|
|
||||||
if (ColourValuePresent(parser_colour.range))
|
|
||||||
muxer_colour->range = parser_colour.range;
|
|
||||||
if (ColourValuePresent(parser_colour.transfer_characteristics))
|
|
||||||
muxer_colour->transfer_characteristics =
|
|
||||||
parser_colour.transfer_characteristics;
|
|
||||||
if (ColourValuePresent(parser_colour.primaries))
|
|
||||||
muxer_colour->primaries = parser_colour.primaries;
|
|
||||||
if (ColourValuePresent(parser_colour.max_cll))
|
|
||||||
muxer_colour->max_cll = parser_colour.max_cll;
|
|
||||||
if (ColourValuePresent(parser_colour.max_fall))
|
|
||||||
muxer_colour->max_fall = parser_colour.max_fall;
|
|
||||||
|
|
||||||
if (parser_colour.mastering_metadata) {
|
|
||||||
mkvmuxer::MasteringMetadata muxer_mm;
|
|
||||||
if (!CopyMasteringMetadata(*parser_colour.mastering_metadata, &muxer_mm))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace
|
} // end namespace
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
@@ -473,7 +378,7 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
if (pVideoTrack->GetColour()) {
|
if (pVideoTrack->GetColour()) {
|
||||||
mkvmuxer::Colour muxer_colour;
|
mkvmuxer::Colour muxer_colour;
|
||||||
if (!CopyColour(*pVideoTrack->GetColour(), &muxer_colour))
|
if (!libwebm::CopyColour(*pVideoTrack->GetColour(), &muxer_colour))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
if (!video->SetColour(muxer_colour))
|
if (!video->SetColour(muxer_colour))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
Reference in New Issue
Block a user