libstagefright: Explicitly free smart pointer objects

This commit is contained in:
Mohamed Naufal 2011-09-14 21:01:07 +05:30
parent 1a2d8c8b35
commit e7f9aa6ff5
1 changed files with 14 additions and 10 deletions

View File

@ -58,7 +58,7 @@ struct StagefrightContext {
AVBitStreamFilterContext *bsfc;
uint8_t* orig_extradata;
int orig_extradata_size;
sp<MediaSource> source;
sp<MediaSource> *source;
List<Frame*> *in_queue, *out_queue;
pthread_mutex_t in_mutex, out_mutex;
pthread_cond_t condition;
@ -74,7 +74,7 @@ struct StagefrightContext {
int dummy_bufsize;
OMXClient *client;
sp<MediaSource> decoder;
sp<MediaSource> *decoder;
const char *decoder_component;
};
@ -156,9 +156,9 @@ void* decode_thread(void *arg)
decode_done = 1;
s->end_frame = NULL;
} else {
frame->status = s->decoder->read(&buffer);
frame->status = (*s->decoder)->read(&buffer);
if (frame->status == OK) {
sp<MetaData> outFormat = s->decoder->getFormat();
sp<MetaData> outFormat = (*s->decoder)->getFormat();
outFormat->findInt32(kKeyWidth , &frame->w);
outFormat->findInt32(kKeyHeight, &frame->h);
frame->size = buffer->range_length();
@ -220,7 +220,8 @@ static av_cold int Stagefright_init(AVCodecContext *avctx)
android::ProcessState::self()->startThreadPool();
s->source = new CustomSource(avctx, meta);
s->source = new sp<MediaSource>();
*s->source = new CustomSource(avctx, meta);
s->in_queue = new List<Frame*>;
s->out_queue = new List<Frame*>;
s->client = new OMXClient;
@ -237,17 +238,18 @@ static av_cold int Stagefright_init(AVCodecContext *avctx)
goto fail;
}
s->decoder = OMXCodec::Create(s->client->interface(), meta,
false, s->source, NULL,
s->decoder = new sp<MediaSource>();
*s->decoder = OMXCodec::Create(s->client->interface(), meta,
false, *s->source, NULL,
OMXCodec::kClientNeedsFramebuffer);
if (s->decoder->start() != OK) {
if ((*s->decoder)->start() != OK) {
av_log(avctx, AV_LOG_ERROR, "Cannot start decoder\n");
ret = -1;
s->client->disconnect();
goto fail;
}
outFormat = s->decoder->getFormat();
outFormat = (*s->decoder)->getFormat();
outFormat->findInt32(kKeyColorFormat, &colorFormat);
if (colorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar ||
colorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
@ -472,7 +474,7 @@ static av_cold int Stagefright_close(AVCodecContext *avctx)
av_freep(&frame);
}
s->decoder->stop();
(*s->decoder)->stop();
s->client->disconnect();
if (s->decoder_component)
@ -490,6 +492,8 @@ static av_cold int Stagefright_close(AVCodecContext *avctx)
delete s->in_queue;
delete s->out_queue;
delete s->client;
delete s->decoder;
delete s->source;
pthread_mutex_destroy(&s->in_mutex);
pthread_mutex_destroy(&s->out_mutex);