Reintroduced keeping the state of failed initialization.
As Stephan said, some apps ignore the return value of Encode(), and since _OpenCodecIfNeeded() is called from there, this could cause wasting of cpu cycles. Change-Id: I80e1464d8532ebf80c514685ef3a25d98d8142fb
This commit is contained in:
@@ -44,7 +44,7 @@ AVCodecEncoder::AVCodecEncoder(uint32 codecID, int bitRateScale)
|
||||
fCodecID((CodecID)codecID),
|
||||
fCodec(NULL),
|
||||
fCodecContext(avcodec_alloc_context3(NULL)),
|
||||
fCodecInitialized(false),
|
||||
fCodecInitStatus(CODEC_INIT_NEEDED),
|
||||
fFrame(av_frame_alloc()),
|
||||
fSwsContext(NULL),
|
||||
fFramesWritten(0)
|
||||
@@ -465,9 +465,12 @@ AVCodecEncoder::_Setup()
|
||||
bool
|
||||
AVCodecEncoder::_OpenCodecIfNeeded()
|
||||
{
|
||||
if (fCodecInitialized)
|
||||
if (fCodecInitStatus == CODEC_INIT_DONE)
|
||||
return true;
|
||||
|
||||
if (fCodecInitStatus == CODEC_INIT_FAILED)
|
||||
return false;
|
||||
|
||||
fCodecContext->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
|
||||
|
||||
// Some codecs need this to be set before open
|
||||
@@ -478,13 +481,13 @@ AVCodecEncoder::_OpenCodecIfNeeded()
|
||||
// Open the codec
|
||||
int result = avcodec_open2(fCodecContext, fCodec, NULL);
|
||||
if (result >= 0)
|
||||
fCodecInitialized = true;
|
||||
fCodecInitStatus = CODEC_INIT_DONE;
|
||||
else
|
||||
fCodecInitialized = false;
|
||||
fCodecInitStatus = CODEC_INIT_FAILED;
|
||||
|
||||
TRACE(" avcodec_open(%p, %p): %d\n", fCodecContext, fCodec, result);
|
||||
|
||||
return fCodecInitialized;
|
||||
return fCodecInitStatus == CODEC_INIT_DONE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -75,8 +75,13 @@ private:
|
||||
CodecID fCodecID;
|
||||
AVCodec* fCodec;
|
||||
AVCodecContext* fCodecContext;
|
||||
|
||||
bool fCodecInitialized;
|
||||
|
||||
enum {
|
||||
CODEC_INIT_NEEDED = 0,
|
||||
CODEC_INIT_DONE,
|
||||
CODEC_INIT_FAILED
|
||||
};
|
||||
uint32 fCodecInitStatus;
|
||||
|
||||
// For video (color space conversion):
|
||||
AVPicture fSrcFrame;
|
||||
|
||||
Reference in New Issue
Block a user