content/media/VideoUtils.h

Fri, 16 Jan 2015 04:50:19 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 04:50:19 +0100
branch
TOR_BUG_9701
changeset 13
44a2da4a2ab2
permissions
-rw-r--r--

Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #ifndef VideoUtils_h
     8 #define VideoUtils_h
    10 #include "mozilla/Attributes.h"
    11 #include "mozilla/ReentrantMonitor.h"
    12 #include "mozilla/CheckedInt.h"
    14 #if !(defined(XP_WIN) || defined(XP_MACOSX) || defined(LINUX)) || \
    15     defined(MOZ_ASAN)
    16 // For MEDIA_THREAD_STACK_SIZE
    17 #include "nsIThreadManager.h"
    18 #endif
    19 #include "nsThreadUtils.h"
    20 #include "prtime.h"
    21 #include "AudioSampleFormat.h"
    23 using mozilla::CheckedInt64;
    24 using mozilla::CheckedUint64;
    25 using mozilla::CheckedInt32;
    26 using mozilla::CheckedUint32;
    28 struct nsIntSize;
    29 struct nsIntRect;
    31 // This file contains stuff we'd rather put elsewhere, but which is
    32 // dependent on other changes which we don't want to wait for. We plan to
    33 // remove this file in the near future.
    36 // This belongs in xpcom/monitor/Monitor.h, once we've made
    37 // mozilla::Monitor non-reentrant.
    38 namespace mozilla {
    40 /**
    41  * ReentrantMonitorConditionallyEnter
    42  *
    43  * Enters the supplied monitor only if the conditional value |aEnter| is true.
    44  * E.g. Used to allow unmonitored read access on the decode thread,
    45  * and monitored access on all other threads.
    46  */
    47 class MOZ_STACK_CLASS ReentrantMonitorConditionallyEnter
    48 {
    49 public:
    50   ReentrantMonitorConditionallyEnter(bool aEnter,
    51                                      ReentrantMonitor &aReentrantMonitor) :
    52     mReentrantMonitor(nullptr)
    53   {
    54     MOZ_COUNT_CTOR(ReentrantMonitorConditionallyEnter);
    55     if (aEnter) {
    56       mReentrantMonitor = &aReentrantMonitor;
    57       NS_ASSERTION(mReentrantMonitor, "null monitor");
    58       mReentrantMonitor->Enter();
    59     }
    60   }
    61   ~ReentrantMonitorConditionallyEnter(void)
    62   {
    63     if (mReentrantMonitor) {
    64       mReentrantMonitor->Exit();
    65     }
    66     MOZ_COUNT_DTOR(ReentrantMonitorConditionallyEnter);
    67   }
    68 private:
    69   // Restrict to constructor and destructor defined above.
    70   ReentrantMonitorConditionallyEnter();
    71   ReentrantMonitorConditionallyEnter(const ReentrantMonitorConditionallyEnter&);
    72   ReentrantMonitorConditionallyEnter& operator =(const ReentrantMonitorConditionallyEnter&);
    73   static void* operator new(size_t) CPP_THROW_NEW;
    74   static void operator delete(void*);
    76   ReentrantMonitor* mReentrantMonitor;
    77 };
    79 // Shuts down a thread asynchronously.
    80 class ShutdownThreadEvent : public nsRunnable
    81 {
    82 public:
    83   ShutdownThreadEvent(nsIThread* aThread) : mThread(aThread) {}
    84   ~ShutdownThreadEvent() {}
    85   NS_IMETHOD Run() MOZ_OVERRIDE {
    86     mThread->Shutdown();
    87     mThread = nullptr;
    88     return NS_OK;
    89   }
    90 private:
    91   nsCOMPtr<nsIThread> mThread;
    92 };
    94 class MediaResource;
    96 namespace dom {
    97 class TimeRanges;
    98 }
   100 // Estimates the buffered ranges of a MediaResource using a simple
   101 // (byteOffset/length)*duration method. Probably inaccurate, but won't
   102 // do file I/O, and can be used when we don't have detailed knowledge
   103 // of the byte->time mapping of a resource. aDurationUsecs is the duration
   104 // of the media in microseconds. Estimated buffered ranges are stored in
   105 // aOutBuffered. Ranges are 0-normalized, i.e. in the range of (0,duration].
   106 void GetEstimatedBufferedTimeRanges(mozilla::MediaResource* aStream,
   107                                     int64_t aDurationUsecs,
   108                                     mozilla::dom::TimeRanges* aOutBuffered);
   110 // Converts from number of audio frames (aFrames) to microseconds, given
   111 // the specified audio rate (aRate). Stores result in aOutUsecs. Returns true
   112 // if the operation succeeded, or false if there was an integer overflow
   113 // while calulating the conversion.
   114 CheckedInt64 FramesToUsecs(int64_t aFrames, uint32_t aRate);
   116 // Converts from microseconds (aUsecs) to number of audio frames, given the
   117 // specified audio rate (aRate). Stores the result in aOutFrames. Returns
   118 // true if the operation succeeded, or false if there was an integer
   119 // overflow while calulating the conversion.
   120 CheckedInt64 UsecsToFrames(int64_t aUsecs, uint32_t aRate);
   122 // Number of microseconds per second. 1e6.
   123 static const int64_t USECS_PER_S = 1000000;
   125 // Number of microseconds per millisecond.
   126 static const int64_t USECS_PER_MS = 1000;
   128 // Converts seconds to milliseconds.
   129 #define MS_TO_SECONDS(s) ((double)(s) / (PR_MSEC_PER_SEC))
   131 // Converts from seconds to microseconds. Returns failure if the resulting
   132 // integer is too big to fit in an int64_t.
   133 nsresult SecondsToUsecs(double aSeconds, int64_t& aOutUsecs);
   135 // The maximum height and width of the video. Used for
   136 // sanitizing the memory allocation of the RGB buffer.
   137 // The maximum resolution we anticipate encountering in the
   138 // wild is 2160p - 3840x2160 pixels.
   139 static const int32_t MAX_VIDEO_WIDTH = 4000;
   140 static const int32_t MAX_VIDEO_HEIGHT = 3000;
   142 // Scales the display rect aDisplay by aspect ratio aAspectRatio.
   143 // Note that aDisplay must be validated by IsValidVideoRegion()
   144 // before being used!
   145 void ScaleDisplayByAspectRatio(nsIntSize& aDisplay, float aAspectRatio);
   147 // The amount of virtual memory reserved for thread stacks.
   148 #if (defined(XP_WIN) || defined(XP_MACOSX) || defined(LINUX)) && \
   149     !defined(MOZ_ASAN)
   150 #define MEDIA_THREAD_STACK_SIZE (128 * 1024)
   151 #else
   152 // All other platforms use their system defaults.
   153 #define MEDIA_THREAD_STACK_SIZE nsIThreadManager::DEFAULT_STACK_SIZE
   154 #endif
   156 // Downmix multichannel Audio samples to Stereo.
   157 // Input are the buffer contains multichannel data,
   158 // the number of channels and the number of frames.
   159 int DownmixAudioToStereo(mozilla::AudioDataValue* buffer,
   160                          int channels,
   161                          uint32_t frames);
   163 bool IsVideoContentType(const nsCString& aContentType);
   165 // Returns true if it's safe to use aPicture as the picture to be
   166 // extracted inside a frame of size aFrame, and scaled up to and displayed
   167 // at a size of aDisplay. You should validate the frame, picture, and
   168 // display regions before using them to display video frames.
   169 bool IsValidVideoRegion(const nsIntSize& aFrame, const nsIntRect& aPicture,
   170                         const nsIntSize& aDisplay);
   172 } // end namespace mozilla
   174 #endif

mercurial