Sfoglia il codice sorgente

ffmpeg: Prefer av_packet_alloc over allocating AVPacket ourselves

av_packet_alloc/av_packet_free will know the correct size of AVPacket,
even if the ABI should change. So, we use it when it's available.
Sam Edwards 7 anni fa
parent
commit
eb591674e0

+ 24 - 10
panda/src/ffmpeg/ffmpegAudioCursor.cxx

@@ -164,7 +164,12 @@ FfmpegAudioCursor(FfmpegAudio *src) :
   _frame = avcodec_alloc_frame();
   _frame = avcodec_alloc_frame();
 #endif
 #endif
 
 
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
+  _packet = av_packet_alloc();
+#else
   _packet = new AVPacket;
   _packet = new AVPacket;
+#endif
+
   _buffer_size = AVCODEC_MAX_AUDIO_FRAME_SIZE / 2;
   _buffer_size = AVCODEC_MAX_AUDIO_FRAME_SIZE / 2;
   _buffer_alloc = new int16_t[_buffer_size + 64];
   _buffer_alloc = new int16_t[_buffer_size + 64];
 
 
@@ -213,15 +218,15 @@ cleanup() {
   }
   }
 
 
   if (_packet) {
   if (_packet) {
-    if (_packet->data) {
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
-      av_packet_unref(_packet);
+    av_packet_free(&_packet);
 #else
 #else
+    if (_packet->data) {
       av_free_packet(_packet);
       av_free_packet(_packet);
-#endif
     }
     }
     delete _packet;
     delete _packet;
     _packet = NULL;
     _packet = NULL;
+#endif
   }
   }
 
 
   if (_buffer_alloc) {
   if (_buffer_alloc) {
@@ -303,16 +308,25 @@ reload_buffer() {
     } else if (_packet_size > 0) {
     } else if (_packet_size > 0) {
       int bufsize = _buffer_size * 2;
       int bufsize = _buffer_size * 2;
       int got_frame;
       int got_frame;
-      AVPacket pkt;
-      av_init_packet(&pkt);
-      pkt.data = _packet_data;
-      pkt.size = _packet_size;
-      int len = avcodec_decode_audio4(_audio_ctx, _frame, &got_frame, &pkt);
+
+      AVPacket *pkt;
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
+      pkt = av_packet_alloc();
+#else
+      AVPacket _pkt;
+      pkt = &_pkt;
+      av_init_packet(pkt);
+#endif
+      pkt->data = _packet_data;
+      pkt->size = _packet_size;
+
+      int len = avcodec_decode_audio4(_audio_ctx, _frame, &got_frame, pkt);
       movies_debug("avcodec_decode_audio4 returned " << len);
       movies_debug("avcodec_decode_audio4 returned " << len);
+
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
-      av_packet_unref(&pkt);
+      av_packet_free(&pkt);
 #else
 #else
-      av_free_packet(&pkt);
+      av_free_packet(pkt);
 #endif
 #endif
 
 
       bufsize = 0;
       bufsize = 0;

+ 8 - 4
panda/src/ffmpeg/ffmpegVideoCursor.cxx

@@ -94,8 +94,12 @@ init_from(FfmpegVideo *source) {
     return;
     return;
   }
   }
 
 
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
+  _packet = av_packet_alloc();
+#else
   _packet = new AVPacket;
   _packet = new AVPacket;
-  memset(_packet, 0, sizeof(AVPacket));
+  av_init_packet(_packet);
+#endif
 
 
   fetch_packet(0);
   fetch_packet(0);
   fetch_frame(-1);
   fetch_frame(-1);
@@ -624,15 +628,15 @@ cleanup() {
   }
   }
 
 
   if (_packet) {
   if (_packet) {
-    if (_packet->data) {
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
-      av_packet_unref(_packet);
+    av_packet_free(&_packet);
 #else
 #else
+    if (_packet->data) {
       av_free_packet(_packet);
       av_free_packet(_packet);
-#endif
     }
     }
     delete _packet;
     delete _packet;
     _packet = NULL;
     _packet = NULL;
+#endif
   }
   }
 }
 }