libstagefright: Explicitly free smart pointer objects
authorMohamed Naufal <naufal22@gmail.com>
Wed, 14 Sep 2011 15:31:07 +0000 (21:01 +0530)
committerMohamed Naufal <naufal22@gmail.com>
Wed, 14 Sep 2011 15:31:07 +0000 (21:01 +0530)
libavcodec/libstagefright.cpp

index e31a2ec..2022bab 100644 (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);