Bug 1231848 - Do not write framerate metadata to webm container in MediaRecorder. r?jesup, r?bechen, r?rillian
MozReview-Commit-ID: 2lehFGZTPxh
--- a/dom/media/encoder/VP8TrackEncoder.cpp
+++ b/dom/media/encoder/VP8TrackEncoder.cpp
@@ -183,17 +183,16 @@ VP8TrackEncoder::GetMetadata()
return nullptr;
}
RefPtr<VP8Metadata> meta = new VP8Metadata();
meta->mWidth = mFrameWidth;
meta->mHeight = mFrameHeight;
meta->mDisplayWidth = mDisplayWidth;
meta->mDisplayHeight = mDisplayHeight;
- meta->mEncodedFrameRate = mEncodedFrameRate;
return meta.forget();
}
bool
VP8TrackEncoder::GetEncodedPartitions(EncodedFrameContainer& aData)
{
vpx_codec_iter_t iter = nullptr;
--- a/dom/media/webm/EbmlComposer.cpp
+++ b/dom/media/webm/EbmlComposer.cpp
@@ -41,17 +41,17 @@ void EbmlComposer::GenerateHeader()
{
EbmlLoc trackLoc;
Ebml_StartSubElement(&ebml, &trackLoc, Tracks);
{
// Video
if (mWidth > 0 && mHeight > 0) {
writeVideoTrack(&ebml, 0x1, 0, "V_VP8",
mWidth, mHeight,
- mDisplayWidth, mDisplayHeight, mFrameRate);
+ mDisplayWidth, mDisplayHeight);
}
// Audio
if (mCodecPrivateData.Length() > 0) {
// Extract the pre-skip from mCodecPrivateData
// then convert it to nanoseconds.
// Details in OpusTrackEncoder.cpp.
mCodecDelay =
(uint64_t)LittleEndian::readUint16(mCodecPrivateData.Elements() + 10)
@@ -171,29 +171,26 @@ EbmlComposer::WriteSimpleBlock(EncodedFr
MOZ_ASSERT(ebml.offset <= DEFAULT_HEADER_SIZE +
aFrame->GetFrameData().Length(),
"write more data > EBML_BUFFER_SIZE");
block->SetLength(ebml.offset);
}
void
EbmlComposer::SetVideoConfig(uint32_t aWidth, uint32_t aHeight,
- uint32_t aDisplayWidth, uint32_t aDisplayHeight,
- float aFrameRate)
+ uint32_t aDisplayWidth, uint32_t aDisplayHeight)
{
MOZ_ASSERT(aWidth > 0, "Width should > 0");
MOZ_ASSERT(aHeight > 0, "Height should > 0");
MOZ_ASSERT(aDisplayWidth > 0, "DisplayWidth should > 0");
MOZ_ASSERT(aDisplayHeight > 0, "DisplayHeight should > 0");
- MOZ_ASSERT(aFrameRate > 0, "FrameRate should > 0");
mWidth = aWidth;
mHeight = aHeight;
mDisplayWidth = aDisplayWidth;
mDisplayHeight = aDisplayHeight;
- mFrameRate = aFrameRate;
}
void
EbmlComposer::SetAudioConfig(uint32_t aSampleFreq, uint32_t aChannels)
{
MOZ_ASSERT(aSampleFreq > 0, "SampleFreq should > 0");
MOZ_ASSERT(aChannels > 0, "Channels should > 0");
mSampleFreq = aSampleFreq;
@@ -223,14 +220,13 @@ EbmlComposer::ExtractBuffer(nsTArray<nsT
EbmlComposer::EbmlComposer()
: mFlushState(FLUSH_NONE)
, mClusterHeaderIndex(0)
, mClusterLengthLoc(0)
, mCodecDelay(0)
, mClusterTimecode(0)
, mWidth(0)
, mHeight(0)
- , mFrameRate(0)
, mSampleFreq(0)
, mChannels(0)
{}
} // namespace mozilla
--- a/dom/media/webm/EbmlComposer.h
+++ b/dom/media/webm/EbmlComposer.h
@@ -14,18 +14,18 @@ namespace mozilla {
* A WebM muxer helper for package the valid WebM format.
*/
class EbmlComposer {
public:
EbmlComposer();
/*
* Assign the parameter which header required.
*/
- void SetVideoConfig(uint32_t aWidth, uint32_t aHeight, uint32_t aDisplayWidth,
- uint32_t aDisplayHeight, float aFrameRate);
+ void SetVideoConfig(uint32_t aWidth, uint32_t aHeight,
+ uint32_t aDisplayWidth, uint32_t aDisplayHeight);
void SetAudioConfig(uint32_t aSampleFreq, uint32_t aChannels);
/*
* Set the CodecPrivateData for writing in header.
*/
void SetAudioCodecPrivateData(nsTArray<uint8_t>& aBufs)
{
mCodecPrivateData.AppendElements(aBufs);
@@ -73,17 +73,16 @@ private:
// The timecode of the cluster.
uint64_t mClusterTimecode;
// Video configuration
int mWidth;
int mHeight;
int mDisplayWidth;
int mDisplayHeight;
- float mFrameRate;
// Audio configuration
float mSampleFreq;
int mChannels;
};
} // namespace mozilla
#endif
--- a/dom/media/webm/WebMWriter.cpp
+++ b/dom/media/webm/WebMWriter.cpp
@@ -52,18 +52,17 @@ WebMWriter::SetMetadata(TrackMetadataBas
MOZ_ASSERT(aMetadata);
PROFILER_LABEL("WebMWriter", "SetMetadata",
js::ProfileEntry::Category::OTHER);
if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VP8) {
VP8Metadata* meta = static_cast<VP8Metadata*>(aMetadata);
MOZ_ASSERT(meta, "Cannot find vp8 encoder metadata");
mEbmlComposer->SetVideoConfig(meta->mWidth, meta->mHeight,
- meta->mDisplayWidth, meta->mDisplayHeight,
- meta->mEncodedFrameRate);
+ meta->mDisplayWidth, meta->mDisplayHeight);
mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_VIDEO_TRACK;
}
if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VORBIS) {
VorbisMetadata* meta = static_cast<VorbisMetadata*>(aMetadata);
MOZ_ASSERT(meta, "Cannot find vorbis encoder metadata");
mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
mEbmlComposer->SetAudioCodecPrivateData(meta->mData);
--- a/dom/media/webm/WebMWriter.h
+++ b/dom/media/webm/WebMWriter.h
@@ -26,17 +26,16 @@ public:
// VP8 meta data structure
class VP8Metadata : public TrackMetadataBase
{
public:
int32_t mWidth;
int32_t mHeight;
int32_t mDisplayWidth;
int32_t mDisplayHeight;
- int32_t mEncodedFrameRate;
MetadataKind GetKind() const override { return METADATA_VP8; }
};
/**
* WebM writer helper
* This class accepts encoder to set audio or video meta data or
* encoded data to ebml Composer, and get muxing data through GetContainerData.
* The ctor/dtor run in the MediaRecorder thread, others run in MediaEncoder thread.
--- a/media/libmkv/WebMElement.c
+++ b/media/libmkv/WebMElement.c
@@ -52,18 +52,17 @@ static UInt64 generateTrackID(unsigned i
r = r << 32;
r += rand();
// UInt64 rval = t ^ r;
return t ^ r;
}
void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
const char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
- unsigned int displayWidth, unsigned int displayHeight,
- double frameRate) {
+ unsigned int displayWidth, unsigned int displayHeight) {
EbmlLoc start;
UInt64 trackID;
Ebml_StartSubElement(glob, &start, TrackEntry);
Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
trackID = generateTrackID(trackNumber);
Ebml_SerializeUnsigned(glob, TrackUID, trackID);
Ebml_SerializeString(glob, CodecName, "VP8"); // TODO shouldn't be fixed
@@ -75,17 +74,16 @@ void writeVideoTrack(EbmlGlobal *glob, u
Ebml_SerializeUnsigned(glob, PixelWidth, pixelWidth);
Ebml_SerializeUnsigned(glob, PixelHeight, pixelHeight);
if (pixelWidth != displayWidth) {
Ebml_SerializeUnsigned(glob, DisplayWidth, displayWidth);
}
if (pixelHeight != displayHeight) {
Ebml_SerializeUnsigned(glob, DisplayHeight, displayHeight);
}
- Ebml_SerializeFloat(glob, FrameRate, frameRate);
Ebml_EndSubElement(glob, &videoStart); // Video
}
Ebml_EndSubElement(glob, &start); // Track Entry
}
void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
const char *codecId, double samplingFrequency, unsigned int channels,
uint64_t codecDelay, uint64_t seekPreRoll,
unsigned char *private, unsigned long privateSize) {
--- a/media/libmkv/WebMElement.h
+++ b/media/libmkv/WebMElement.h
@@ -16,18 +16,17 @@ extern "C" {
#include "EbmlWriter.h"
// these are helper functions
void writeHeader(EbmlGlobal *ebml);
void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc *startInfo, unsigned long timeCodeScale, double duration);
// this function is a helper only, it assumes a lot of defaults
void writeVideoTrack(EbmlGlobal *ebml, unsigned int trackNumber, int flagLacing,
const char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
- unsigned int displayWidth, unsigned int displayHeight,
- double frameRate);
+ unsigned int displayWidth, unsigned int displayHeight);
void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
const char *codecId, double samplingFrequency, unsigned int channels,
uint64_t codecDelay, uint64_t seekPreRoll,
unsigned char *private_, unsigned long privateSize);
void writeSimpleBlock(EbmlGlobal *ebml, unsigned char trackNumber, short timeCode,
int isKeyframe, unsigned char lacingFlag, int discardable,
unsigned char *data, unsigned long dataLength);