Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit ae286ef

Browse files
committed
Bug 970774 - Add display width/height for track encoder. r=rillian
1 parent 3b5a19f commit ae286ef

14 files changed

Lines changed: 123 additions & 9 deletions

content/media/encoder/OmxTrackEncoder.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ namespace mozilla {
2626
#define GET_ENCODED_VIDEO_FRAME_TIMEOUT 100000 // microseconds
2727

2828
nsresult
29-
OmxVideoTrackEncoder::Init(int aWidth, int aHeight, TrackRate aTrackRate)
29+
OmxVideoTrackEncoder::Init(int aWidth, int aHeight, int aDisplayWidth,
30+
int aDisplayHeight, TrackRate aTrackRate)
3031
{
3132
mFrameWidth = aWidth;
3233
mFrameHeight = aHeight;
3334
mTrackRate = aTrackRate;
35+
mDisplayWidth = aDisplayWidth;
36+
mDisplayHeight = aDisplayHeight;
3437

3538
mEncoder = OMXCodecWrapper::CreateAVCEncoder();
3639
NS_ENSURE_TRUE(mEncoder, NS_ERROR_FAILURE);

content/media/encoder/OmxTrackEncoder.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ class OmxVideoTrackEncoder: public VideoTrackEncoder
3535
nsresult GetEncodedTrack(EncodedFrameContainer& aData) MOZ_OVERRIDE;
3636

3737
protected:
38-
nsresult Init(int aWidth, int aHeight, TrackRate aTrackRate) MOZ_OVERRIDE;
38+
nsresult Init(int aWidth, int aHeight,
39+
int aDisplayWidth, int aDisplayHeight,
40+
TrackRate aTrackRate) MOZ_OVERRIDE;
3941

4042
private:
4143
nsAutoPtr<android::OMXVideoEncoder> mEncoder;

content/media/encoder/TrackEncoder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,10 @@ VideoTrackEncoder::NotifyQueuedTrackChanges(MediaStreamGraph* aGraph,
163163
VideoChunk chunk = *iter;
164164
if (!chunk.IsNull()) {
165165
gfx::IntSize imgsize = chunk.mFrame.GetImage()->GetSize();
166-
nsresult rv = Init(imgsize.width, imgsize.height, aTrackRate);
166+
gfxIntSize intrinsicSize = chunk.mFrame.GetIntrinsicSize();
167+
nsresult rv = Init(imgsize.width, imgsize.height,
168+
intrinsicSize.width, intrinsicSize.height,
169+
aTrackRate);
167170
if (NS_FAILED(rv)) {
168171
LOG("[VideoTrackEncoder]: Fail to initialize the encoder!");
169172
NotifyCancel();
@@ -214,7 +217,8 @@ VideoTrackEncoder::NotifyEndOfStream()
214217
// If source video track is muted till the end of encoding, initialize the
215218
// encoder with default frame width, frame height, and track rate.
216219
if (!mCanceled && !mInitialized) {
217-
Init(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT, DEFAULT_TRACK_RATE);
220+
Init(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT,
221+
DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT, DEFAULT_TRACK_RATE);
218222
}
219223

220224
ReentrantMonitorAutoEnter mon(mReentrantMonitor);

content/media/encoder/TrackEncoder.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ class VideoTrackEncoder : public TrackEncoder
222222
: TrackEncoder()
223223
, mFrameWidth(0)
224224
, mFrameHeight(0)
225+
, mDisplayWidth(0)
226+
, mDisplayHeight(0)
225227
, mTrackRate(0)
226228
, mTotalFrameDuration(0)
227229
{}
@@ -244,7 +246,8 @@ class VideoTrackEncoder : public TrackEncoder
244246
* mReentrantMonitor will be notified after it has successfully initialized,
245247
* and this method is called on the MediaStramGraph thread.
246248
*/
247-
virtual nsresult Init(int aWidth, int aHeight, TrackRate aTrackRate) = 0;
249+
virtual nsresult Init(int aWidth, int aHeight, int aDisplayWidth,
250+
int aDisplayHeight, TrackRate aTrackRate) = 0;
248251

249252
/**
250253
* Appends source video frames to mRawSegment. We only append the source chunk
@@ -275,6 +278,16 @@ class VideoTrackEncoder : public TrackEncoder
275278
*/
276279
int mFrameHeight;
277280

281+
/**
282+
* The display width of source video frame.
283+
*/
284+
int mDisplayWidth;
285+
286+
/**
287+
* The display height of source video frame.
288+
*/
289+
int mDisplayHeight;
290+
278291
/**
279292
* The track rate of source video.
280293
*/

content/media/encoder/VP8TrackEncoder.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@ VP8TrackEncoder::~VP8TrackEncoder()
5353
}
5454

5555
nsresult
56-
VP8TrackEncoder::Init(int32_t aWidth, int32_t aHeight, TrackRate aTrackRate)
56+
VP8TrackEncoder::Init(int32_t aWidth, int32_t aHeight, int32_t aDisplayWidth,
57+
int32_t aDisplayHeight,TrackRate aTrackRate)
5758
{
58-
if (aWidth < 1 || aHeight < 1 || aTrackRate <= 0) {
59+
if (aWidth < 1 || aHeight < 1 || aDisplayWidth < 1 || aDisplayHeight < 1
60+
|| aTrackRate <= 0) {
5961
return NS_ERROR_FAILURE;
6062
}
6163

@@ -66,6 +68,8 @@ VP8TrackEncoder::Init(int32_t aWidth, int32_t aHeight, TrackRate aTrackRate)
6668
mEncodedFrameDuration = mTrackRate / mEncodedFrameRate;
6769
mFrameWidth = aWidth;
6870
mFrameHeight = aHeight;
71+
mDisplayWidth = aDisplayWidth;
72+
mDisplayHeight = aDisplayHeight;
6973

7074
// Encoder configuration structure.
7175
vpx_codec_enc_cfg_t config;
@@ -153,6 +157,8 @@ VP8TrackEncoder::GetMetadata()
153157
nsRefPtr<VP8Metadata> meta = new VP8Metadata();
154158
meta->mWidth = mFrameWidth;
155159
meta->mHeight = mFrameHeight;
160+
meta->mDisplayWidth = mDisplayWidth;
161+
meta->mDisplayHeight = mDisplayHeight;
156162
meta->mEncodedFrameRate = mEncodedFrameRate;
157163

158164
return meta.forget();

content/media/encoder/VP8TrackEncoder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class VP8TrackEncoder : public VideoTrackEncoder
3838

3939
protected:
4040
nsresult Init(int32_t aWidth, int32_t aHeight,
41+
int32_t aDisplayWidth, int32_t aDisplayHeight,
4142
TrackRate aTrackRate) MOZ_FINAL MOZ_OVERRIDE;
4243

4344
private:

content/media/webm/EbmlComposer.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ void EbmlComposer::GenerateHeader()
4141
// Video
4242
if (mWidth > 0 && mHeight > 0) {
4343
writeVideoTrack(&ebml, 0x1, 0, "V_VP8",
44-
mWidth, mHeight, mFrameRate);
44+
mWidth, mHeight,
45+
mDisplayWidth, mDisplayHeight, mFrameRate);
4546
}
4647
// Audio
4748
if (mCodecPrivateData.Length() > 0) {
@@ -123,13 +124,18 @@ EbmlComposer::WriteSimpleBlock(EncodedFrame* aFrame)
123124

124125
void
125126
EbmlComposer::SetVideoConfig(uint32_t aWidth, uint32_t aHeight,
127+
uint32_t aDisplayWidth, uint32_t aDisplayHeight,
126128
float aFrameRate)
127129
{
128130
MOZ_ASSERT(aWidth > 0, "Width should > 0");
129131
MOZ_ASSERT(aHeight > 0, "Height should > 0");
132+
MOZ_ASSERT(aDisplayWidth > 0, "DisplayWidth should > 0");
133+
MOZ_ASSERT(aDisplayHeight > 0, "DisplayHeight should > 0");
130134
MOZ_ASSERT(aFrameRate > 0, "FrameRate should > 0");
131135
mWidth = aWidth;
132136
mHeight = aHeight;
137+
mDisplayWidth = aDisplayWidth;
138+
mDisplayHeight = aDisplayHeight;
133139
mFrameRate = aFrameRate;
134140
}
135141

content/media/webm/EbmlComposer.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ class EbmlComposer {
1919
/*
2020
* Assign the parameter which header required.
2121
*/
22-
void SetVideoConfig(uint32_t aWidth, uint32_t aHeight, float aFrameRate);
22+
void SetVideoConfig(uint32_t aWidth, uint32_t aHeight, uint32_t aDisplayWidth,
23+
uint32_t aDisplayHeight, float aFrameRate);
2324

2425
void SetAudioConfig(uint32_t aSampleFreq, uint32_t aChannels,
2526
uint32_t bitDepth);
@@ -64,6 +65,8 @@ class EbmlComposer {
6465
// Video configuration
6566
int mWidth;
6667
int mHeight;
68+
int mDisplayWidth;
69+
int mDisplayHeight;
6770
float mFrameRate;
6871
// Audio configuration
6972
float mSampleFreq;

content/media/webm/WebMWriter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ WebMWriter::SetMetadata(TrackMetadataBase* aMetadata)
4343
VP8Metadata* meta = static_cast<VP8Metadata*>(aMetadata);
4444
MOZ_ASSERT(meta, "Cannot find vp8 encoder metadata");
4545
mEbmlComposer->SetVideoConfig(meta->mWidth, meta->mHeight,
46+
meta->mDisplayWidth, meta->mDisplayHeight,
4647
meta->mEncodedFrameRate);
4748
mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_VIDEO_TRACK;
4849
}

content/media/webm/WebMWriter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class VP8Metadata : public TrackMetadataBase
2929
public:
3030
int32_t mWidth;
3131
int32_t mHeight;
32+
int32_t mDisplayWidth;
33+
int32_t mDisplayHeight;
3234
int32_t mEncodedFrameRate;
3335
MetadataKind GetKind() const MOZ_OVERRIDE { return METADATA_VP8; }
3436
};

0 commit comments

Comments
 (0)