зеркало из https://github.com/mozilla/gecko-dev.git
Bug 965440 - Try GRALLOC_PLANAR_YCBCR in VideoData::Create on gonk r=nical,doublec
This commit is contained in:
Родитель
de99fe10c0
Коммит
f103bf54a0
|
@ -42,7 +42,7 @@ ValidatePlane(const VideoData::YCbCrBuffer::Plane& aPlane)
|
|||
aPlane.mStride > 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
static bool
|
||||
IsYV12Format(const VideoData::YCbCrBuffer::Plane& aYPlane,
|
||||
const VideoData::YCbCrBuffer::Plane& aCbPlane,
|
||||
|
@ -103,6 +103,45 @@ VideoData* VideoData::ShallowCopyUpdateDuration(VideoData* aOther,
|
|||
return v;
|
||||
}
|
||||
|
||||
/* static */
|
||||
void VideoData::SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
|
||||
VideoInfo& aInfo,
|
||||
const YCbCrBuffer &aBuffer,
|
||||
const IntRect& aPicture,
|
||||
bool aCopyData)
|
||||
{
|
||||
if (!aVideoImage) {
|
||||
return;
|
||||
}
|
||||
const YCbCrBuffer::Plane &Y = aBuffer.mPlanes[0];
|
||||
const YCbCrBuffer::Plane &Cb = aBuffer.mPlanes[1];
|
||||
const YCbCrBuffer::Plane &Cr = aBuffer.mPlanes[2];
|
||||
|
||||
PlanarYCbCrData data;
|
||||
data.mYChannel = Y.mData + Y.mOffset;
|
||||
data.mYSize = IntSize(Y.mWidth, Y.mHeight);
|
||||
data.mYStride = Y.mStride;
|
||||
data.mYSkip = Y.mSkip;
|
||||
data.mCbChannel = Cb.mData + Cb.mOffset;
|
||||
data.mCrChannel = Cr.mData + Cr.mOffset;
|
||||
data.mCbCrSize = IntSize(Cb.mWidth, Cb.mHeight);
|
||||
data.mCbCrStride = Cb.mStride;
|
||||
data.mCbSkip = Cb.mSkip;
|
||||
data.mCrSkip = Cr.mSkip;
|
||||
data.mPicX = aPicture.x;
|
||||
data.mPicY = aPicture.y;
|
||||
data.mPicSize = aPicture.Size();
|
||||
data.mStereoMode = aInfo.mStereoMode;
|
||||
|
||||
aVideoImage->SetDelayedConversion(true);
|
||||
if (aCopyData) {
|
||||
aVideoImage->SetData(data);
|
||||
} else {
|
||||
aVideoImage->SetDataNoCopy(data);
|
||||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
Image* aImage,
|
||||
|
@ -164,14 +203,16 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
|||
aKeyframe,
|
||||
aTimecode,
|
||||
aInfo.mDisplay.ToIntSize()));
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
const YCbCrBuffer::Plane &Y = aBuffer.mPlanes[0];
|
||||
const YCbCrBuffer::Plane &Cb = aBuffer.mPlanes[1];
|
||||
const YCbCrBuffer::Plane &Cr = aBuffer.mPlanes[2];
|
||||
#endif
|
||||
|
||||
if (!aImage) {
|
||||
// Currently our decoder only knows how to output to ImageFormat::PLANAR_YCBCR
|
||||
// format.
|
||||
#if 0
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (IsYV12Format(Y, Cb, Cr)) {
|
||||
v->mImage = aContainer->CreateImage(ImageFormat::GRALLOC_PLANAR_YCBCR);
|
||||
}
|
||||
|
@ -191,32 +232,30 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
|||
"Wrong format?");
|
||||
PlanarYCbCrImage* videoImage = static_cast<PlanarYCbCrImage*>(v->mImage.get());
|
||||
|
||||
PlanarYCbCrData data;
|
||||
data.mYChannel = Y.mData + Y.mOffset;
|
||||
data.mYSize = IntSize(Y.mWidth, Y.mHeight);
|
||||
data.mYStride = Y.mStride;
|
||||
data.mYSkip = Y.mSkip;
|
||||
data.mCbChannel = Cb.mData + Cb.mOffset;
|
||||
data.mCrChannel = Cr.mData + Cr.mOffset;
|
||||
data.mCbCrSize = IntSize(Cb.mWidth, Cb.mHeight);
|
||||
data.mCbCrStride = Cb.mStride;
|
||||
data.mCbSkip = Cb.mSkip;
|
||||
data.mCrSkip = Cr.mSkip;
|
||||
data.mPicX = aPicture.x;
|
||||
data.mPicY = aPicture.y;
|
||||
data.mPicSize = aPicture.Size();
|
||||
data.mStereoMode = aInfo.mStereoMode;
|
||||
|
||||
videoImage->SetDelayedConversion(true);
|
||||
if (!aImage) {
|
||||
videoImage->SetData(data);
|
||||
VideoData::SetVideoDataToImage(videoImage, aInfo, aBuffer, aPicture,
|
||||
true /* aCopyData */);
|
||||
} else {
|
||||
videoImage->SetDataNoCopy(data);
|
||||
VideoData::SetVideoDataToImage(videoImage, aInfo, aBuffer, aPicture,
|
||||
false /* aCopyData */);
|
||||
}
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (!videoImage->IsValid() && !aImage && IsYV12Format(Y, Cb, Cr)) {
|
||||
// Failed to allocate gralloc. Try fallback.
|
||||
v->mImage = aContainer->CreateImage(ImageFormat::PLANAR_YCBCR);
|
||||
if (!v->mImage) {
|
||||
return nullptr;
|
||||
}
|
||||
videoImage = static_cast<PlanarYCbCrImage*>(v->mImage.get());
|
||||
VideoData::SetVideoDataToImage(videoImage, aInfo, aBuffer, aPicture,
|
||||
true /* aCopyData */);
|
||||
}
|
||||
#endif
|
||||
return v.forget();
|
||||
}
|
||||
|
||||
/* static */
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
int64_t aOffset,
|
||||
|
@ -231,6 +270,7 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
|||
aKeyframe, aTimecode, aPicture);
|
||||
}
|
||||
|
||||
/* static */
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
Image* aImage,
|
||||
int64_t aOffset,
|
||||
|
@ -245,6 +285,7 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
|||
aKeyframe, aTimecode, aPicture);
|
||||
}
|
||||
|
||||
/* static */
|
||||
VideoData* VideoData::CreateFromImage(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
int64_t aOffset,
|
||||
|
@ -266,6 +307,7 @@ VideoData* VideoData::CreateFromImage(VideoInfo& aInfo,
|
|||
}
|
||||
|
||||
#ifdef MOZ_OMX_DECODER
|
||||
/* static */
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
int64_t aOffset,
|
||||
|
|
|
@ -102,6 +102,7 @@ public:
|
|||
|
||||
namespace layers {
|
||||
class GraphicBufferLocked;
|
||||
class PlanarYCbCrImage;
|
||||
}
|
||||
|
||||
class VideoInfo;
|
||||
|
@ -113,6 +114,7 @@ public:
|
|||
typedef gfx::IntSize IntSize;
|
||||
typedef layers::ImageContainer ImageContainer;
|
||||
typedef layers::Image Image;
|
||||
typedef layers::PlanarYCbCrImage PlanarYCbCrImage;
|
||||
|
||||
// YCbCr data obtained from decoding the video. The index's are:
|
||||
// 0 = Y
|
||||
|
@ -202,6 +204,14 @@ public:
|
|||
static VideoData* ShallowCopyUpdateDuration(VideoData* aOther,
|
||||
int64_t aDuration);
|
||||
|
||||
// Initialize PlanarYCbCrImage. Only When aCopyData is true,
|
||||
// video data is copied to PlanarYCbCrImage.
|
||||
static void SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
|
||||
VideoInfo& aInfo,
|
||||
const YCbCrBuffer &aBuffer,
|
||||
const IntRect& aPicture,
|
||||
bool aCopyData);
|
||||
|
||||
// Constructs a duplicate VideoData object. This intrinsically tells the
|
||||
// player that it does not need to update the displayed frame when this
|
||||
// frame is played; this frame is identical to the previous.
|
||||
|
|
|
@ -92,6 +92,9 @@ GrallocImage::SetData(const Data& aData)
|
|||
GraphicBuffer::USAGE_SW_WRITE_OFTEN |
|
||||
GraphicBuffer::USAGE_HW_TEXTURE,
|
||||
&desc);
|
||||
if (desc.type() == SurfaceDescriptor::T__None) {
|
||||
return;
|
||||
}
|
||||
mBufferAllocated = true;
|
||||
mGraphicBufferLocked = new GraphicBufferLocked(desc);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче