Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/platforms/wrappers/H264Converter.h
Line
Count
Source (jump to first uncovered line)
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/. */
6
7
#ifndef mozilla_H264Converter_h
8
#define mozilla_H264Converter_h
9
10
#include "PlatformDecoderModule.h"
11
#include "mozilla/Maybe.h"
12
13
namespace mozilla {
14
15
class DecoderDoctorDiagnostics;
16
17
DDLoggedTypeDeclNameAndBase(H264Converter, MediaDataDecoder);
18
19
// H264Converter is a MediaDataDecoder wrapper used to ensure that
20
// only AVCC or AnnexB is fed to the underlying MediaDataDecoder.
21
// The H264Converter allows playback of content where the SPS NAL may not be
22
// provided in the init segment (e.g. AVC3 or Annex B)
23
// H264Converter will monitor the input data, and will delay creation of the
24
// MediaDataDecoder until a SPS and PPS NALs have been extracted.
25
26
class H264Converter
27
  : public MediaDataDecoder
28
  , public DecoderDoctorLifeLogger<H264Converter>
29
{
30
public:
31
32
  H264Converter(PlatformDecoderModule* aPDM,
33
                const CreateDecoderParams& aParams);
34
  virtual ~H264Converter();
35
36
  RefPtr<InitPromise> Init() override;
37
  RefPtr<DecodePromise> Decode(MediaRawData* aSample) override;
38
  RefPtr<DecodePromise> Drain() override;
39
  RefPtr<FlushPromise> Flush() override;
40
  RefPtr<ShutdownPromise> Shutdown() override;
41
  bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
42
  nsCString GetDescriptionName() const override
43
0
  {
44
0
    if (mDecoder) {
45
0
      return mDecoder->GetDescriptionName();
46
0
    }
47
0
    return NS_LITERAL_CSTRING("H264Converter decoder (pending)");
48
0
  }
49
  void SetSeekThreshold(const media::TimeUnit& aTime) override;
50
  bool SupportDecoderRecycling() const override
51
0
  {
52
0
    if (mDecoder) {
53
0
      return mDecoder->SupportDecoderRecycling();
54
0
    }
55
0
    return false;
56
0
  }
57
58
  ConversionRequired NeedsConversion() const override
59
0
  {
60
0
    if (mDecoder) {
61
0
      return mDecoder->NeedsConversion();
62
0
    }
63
0
    // Default so no conversion is performed.
64
0
    return ConversionRequired::kNeedAVCC;
65
0
  }
66
0
  MediaResult GetLastError() const { return mLastError; }
67
68
private:
69
  // Will create the required MediaDataDecoder if need AVCC and we have a SPS NAL.
70
  // Returns NS_ERROR_FAILURE if error is permanent and can't be recovered and
71
  // will set mError accordingly.
72
  MediaResult CreateDecoder(const VideoInfo& aConfig,
73
                         DecoderDoctorDiagnostics* aDiagnostics);
74
  MediaResult CreateDecoderAndInit(MediaRawData* aSample);
75
  MediaResult CheckForSPSChange(MediaRawData* aSample);
76
  void UpdateConfigFromExtraData(MediaByteBuffer* aExtraData);
77
78
  bool CanRecycleDecoder() const;
79
80
  void DecodeFirstSample(MediaRawData* aSample);
81
  void DrainThenFlushDecoder(MediaRawData* aPendingSample);
82
  void FlushThenShutdownDecoder(MediaRawData* aPendingSample);
83
  RefPtr<ShutdownPromise> ShutdownDecoder();
84
85
  RefPtr<PlatformDecoderModule> mPDM;
86
  const VideoInfo mOriginalConfig;
87
  VideoInfo mCurrentConfig;
88
  // Current out of band extra data (as found in metadata's VideoInfo).
89
  RefPtr<MediaByteBuffer> mOriginalExtraData;
90
  RefPtr<layers::KnowsCompositor> mKnowsCompositor;
91
  RefPtr<layers::ImageContainer> mImageContainer;
92
  const RefPtr<TaskQueue> mTaskQueue;
93
  RefPtr<MediaDataDecoder> mDecoder;
94
  MozPromiseRequestHolder<InitPromise> mInitPromiseRequest;
95
  MozPromiseRequestHolder<DecodePromise> mDecodePromiseRequest;
96
  MozPromiseHolder<DecodePromise> mDecodePromise;
97
  MozPromiseRequestHolder<FlushPromise> mFlushRequest;
98
  MediaDataDecoder::DecodedData mPendingFrames;
99
  MozPromiseRequestHolder<DecodePromise> mDrainRequest;
100
  MozPromiseRequestHolder<ShutdownPromise> mShutdownRequest;
101
  RefPtr<ShutdownPromise> mShutdownPromise;
102
  MozPromiseHolder<FlushPromise> mFlushPromise;
103
104
  RefPtr<GMPCrashHelper> mGMPCrashHelper;
105
  Maybe<bool> mNeedAVCC;
106
  MediaResult mLastError;
107
  bool mNeedKeyframe = true;
108
  const TrackInfo::TrackType mType;
109
  MediaEventProducer<TrackInfo::TrackType>* const mOnWaitingForKeyEvent;
110
  const CreateDecoderParams::OptionSet mDecoderOptions;
111
  const CreateDecoderParams::VideoFrameRate mRate;
112
  Maybe<bool> mCanRecycleDecoder;
113
};
114
115
} // namespace mozilla
116
117
#endif // mozilla_H264Converter_h