1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef DOM_MEDIA_PLATFORMS_AGNOSTIC_BYTESTREAMS_ANNEX_B_H_
#define DOM_MEDIA_PLATFORMS_AGNOSTIC_BYTESTREAMS_ANNEX_B_H_
#include "ErrorList.h"
#include "mozilla/RefPtr.h"
#include "mozilla/Result.h"
template <class>
class nsTArray;
namespace mozilla {
class BufferReader;
class MediaRawData;
class MediaByteBuffer;
class AnnexB {
public:
struct NALEntry {
NALEntry(int64_t aOffset, int64_t aSize) : mOffset(aOffset), mSize(aSize) {
MOZ_ASSERT(mOffset >= 0);
MOZ_ASSERT(mSize >= 0);
}
// They should be non-negative, so we use int64_t to assert their value when
// assigning value to them.
int64_t mOffset;
int64_t mSize;
};
// All conversions assume size of NAL length field is 4 bytes.
// Convert a sample from AVCC format to Annex B.
static mozilla::Result<mozilla::Ok, nsresult> ConvertSampleToAnnexB(
mozilla::MediaRawData* aSample, bool aAddSPS = true);
// Convert a sample from Annex B to AVCC.
// an AVCC extradata must not be set.
static bool ConvertSampleToAVCC(
mozilla::MediaRawData* aSample,
const RefPtr<mozilla::MediaByteBuffer>& aAVCCHeader = nullptr);
static mozilla::Result<mozilla::Ok, nsresult> ConvertSampleTo4BytesAVCC(
mozilla::MediaRawData* aSample);
// Parse an AVCC extradata and construct the Annex B sample header.
static already_AddRefed<mozilla::MediaByteBuffer> ConvertExtraDataToAnnexB(
const mozilla::MediaByteBuffer* aExtraData);
// Returns true if format is AVCC and sample has valid extradata.
static bool IsAVCC(const mozilla::MediaRawData* aSample);
// Returns true if format is AnnexB.
static bool IsAnnexB(const mozilla::MediaRawData* aSample);
// Parse NAL entries from the bytes stream to know the offset and the size of
// each NAL in the bytes stream.
static void ParseNALEntries(const Span<const uint8_t>& aSpan,
nsTArray<AnnexB::NALEntry>& aEntries);
private:
// AVCC box parser helper.
static mozilla::Result<mozilla::Ok, nsresult> ConvertSPSOrPPS(
mozilla::BufferReader& aReader, uint8_t aCount,
mozilla::MediaByteBuffer* aAnnexB);
};
} // namespace mozilla
#endif // DOM_MEDIA_PLATFORMS_AGNOSTIC_BYTESTREAMS_ANNEX_B_H_
|