Bug 1231848 - Do not write framerate metadata to webm container in MediaRecorder. r?jesup, r?bechen, r?rillian draft
authorAndreas Pehrson <pehrsons@gmail.com>
Fri, 13 Jan 2017 09:00:55 +0100
changeset 460558 2062563ee69c37b7202391a490ce2c113335c669
parent 459665 c7762987cb120c73128233e384f3b337783b1583
child 460559 8241182f2d808e13297934b0b1e01555e47686a7
push id41416
push userbmo:pehrson@telenordigital.com
push dateFri, 13 Jan 2017 08:13:12 +0000
reviewersjesup, bechen, rillian
bugs1231848
milestone53.0a1
Bug 1231848 - Do not write framerate metadata to webm container in MediaRecorder. r?jesup, r?bechen, r?rillian MozReview-Commit-ID: 2lehFGZTPxh
dom/media/encoder/VP8TrackEncoder.cpp
dom/media/webm/EbmlComposer.cpp
dom/media/webm/EbmlComposer.h
dom/media/webm/WebMWriter.cpp
dom/media/webm/WebMWriter.h
media/libmkv/WebMElement.c
media/libmkv/WebMElement.h
--- 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);