]> git.pld-linux.org Git - packages/mediastreamer.git/commitdiff
- added ffmpeg_5_0_fixes.patch from Debian
authorWitold Filipczyk <witekfl@poczta.onet.pl>
Thu, 26 Oct 2023 17:56:08 +0000 (19:56 +0200)
committerWitold Filipczyk <witekfl@poczta.onet.pl>
Thu, 26 Oct 2023 17:56:08 +0000 (19:56 +0200)
- Wno-error=unused-parameter
- rel 0.2 (compiles)

ffmpeg_5_0_fixes.patch [new file with mode: 0644]
mediastreamer.spec

diff --git a/ffmpeg_5_0_fixes.patch b/ffmpeg_5_0_fixes.patch
new file mode 100644 (file)
index 0000000..9e73a0d
--- /dev/null
@@ -0,0 +1,619 @@
+Description: Port to ffmpeg 5.0 API
+ Not well-tested since we currently don't build the test suite.
+ .
+ Also closes a presumed memory leak in
+ src/utils/jpgloader-ffmpeg.c:jpeg2yuv()
+Author: Dennis Filder <d.filder@web.de>
+Last-Update: 2022-06-28
+Bug-Debian: https://bugs.debian.org/1004819
+--- a/src/utils/ffmpeg-priv.h
++++ b/src/utils/ffmpeg-priv.h
+@@ -66,6 +66,7 @@
+ #if defined(HAVE_LIBAVCODEC_AVCODEC_H)
+ #if LIBAVCODEC_VERSION_INT <= AV_VERSION_INT(52,24,0)
++#if 0
+ /*should work as long as nobody uses avformat.h*/
+ typedef struct AVPacket{
+       uint8_t *data;
+@@ -81,6 +82,7 @@
+       return avcodec_decode_video(avctx,picture, got_picture_ptr,avpkt->data,avpkt->size);
+ }
+ #endif
++#endif
+ #if HAVE_AVCODEC_OLD_CODEC_IDS
+ #include <libavcodec/old_codec_ids.h>
+ #endif
+@@ -117,13 +119,17 @@
+ #endif
+ #ifndef HAVE_FUN_avcodec_encode_video2
++#if 0
+ int avcodec_encode_video2 (AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr);
+ #endif
++#endif
+ #ifndef HAVE_FUN_avcodec_get_context_defaults3 /**/
++#if 0
+ int avcodec_get_context_defaults3 (AVCodecContext *s, AVCodec *codec);
+ AVCodecContext *avcodec_alloc_context3(AVCodec *codec);
+ #endif
++#endif
+ #ifndef HAVE_FUN_avcodec_open2 /**/
+ int avcodec_open2 (AVCodecContext *avctx, AVCodec *codec, AVDictionary **options);
+--- a/src/utils/ffmpeg-priv.c
++++ b/src/utils/ffmpeg-priv.c
+@@ -23,6 +23,7 @@
+ #ifndef HAVE_FUN_avcodec_encode_video2
++#if 0
+ int avcodec_encode_video2 (AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr) {
+       int error=avcodec_encode_video(avctx, avpkt->data, avpkt->size,frame);
+       if (error<0){
+@@ -36,10 +37,12 @@
+       return 0;
+ }
+ #endif
++#endif
+ #ifndef HAVE_FUN_avcodec_get_context_defaults3 /**/
++#if 0
+ int avcodec_get_context_defaults3 (AVCodecContext *s, AVCodec *codec) {
+       avcodec_get_context_defaults(s);
+       return 0;
+@@ -48,6 +51,7 @@
+ AVCodecContext *avcodec_alloc_context3(AVCodec *codec){
+       return avcodec_alloc_context();
+ }
++#endif
+ #endif
+--- a/src/videofilters/videodec.c
++++ b/src/videofilters/videodec.c
+@@ -49,8 +49,8 @@
+ typedef struct DecState{
+-      AVCodecContext av_context;
+-      AVCodec *av_codec;
++      AVCodecContext *av_contextp;
++      const AVCodec *av_codec;
+       enum CodecID codec;
+       mblk_t *input;
+       YuvBuf outbuf;
+@@ -66,11 +66,14 @@
+ }DecState;
++/*
++ * FIXME: With the ffmpeg 5.0 API this ought to return an error when
++ * allocation fails.
++ */
+ static void dec_init(MSFilter *f, enum CodecID cid){
+       DecState *s=(DecState *)ms_new0(DecState,1);
+       ms_ffmpeg_check_init();
+-      avcodec_get_context_defaults3(&s->av_context, NULL);
+       s->allocator = ms_yuv_buf_allocator_new();
+       s->av_codec=NULL;
+       s->codec=cid;
+@@ -86,6 +89,10 @@
+       if (s->av_codec==NULL){
+               ms_error("Could not find decoder %i!",s->codec);
+       }
++      s->av_contextp = avcodec_alloc_context3(s->av_codec);
++      if (s->av_contextp==NULL){
++              ms_error("Could not allocate AVCodecContext!");
++      }
+       s->orig = av_frame_alloc();
+       if (!s->orig) {
+               ms_error("Could not allocate frame");
+@@ -119,9 +126,8 @@
+               av_frame_free(&s->orig);
+               s->orig = NULL;
+       }
+-      if (s->av_context.codec!=NULL){
+-              avcodec_close(&s->av_context);
+-              s->av_context.codec=NULL;
++      if (s->av_contextp && s->av_contextp->codec!=NULL){
++              avcodec_free_context(&s->av_contextp);
+       }
+       ms_yuv_buf_allocator_free(s->allocator);
+       if (s->input!=NULL) freemsg(s->input);
+@@ -160,16 +166,16 @@
+       s->first_image_decoded = FALSE;
+       ms_average_fps_init(&s->fps, "Video decoder: FPS: %f");
+-      if (s->av_context.codec==NULL){
++      if (s->av_contextp && s->av_contextp->codec==NULL){
+               /* we must know picture size before initializing snow decoder*/
+ #if HAVE_AVCODEC_SNOW
+               if (s->codec!=CODEC_ID_SNOW){
+ #endif
+-                      error=avcodec_open2(&s->av_context, s->av_codec, NULL);
++                      error=avcodec_open2(s->av_contextp, s->av_codec, NULL);
+                       if (error!=0) ms_error("avcodec_open() failed: %i",error);
+                       if (s->codec==CODEC_ID_MPEG4 && s->dci_size>0){
+-                              s->av_context.extradata=s->dci;
+-                              s->av_context.extradata_size=s->dci_size;
++                              s->av_contextp->extradata=s->dci;
++                              s->av_contextp->extradata_size=s->dci_size;
+                       }
+ #if HAVE_AVCODEC_SNOW
+               }
+@@ -256,15 +262,15 @@
+               uint32_t h = ntohl(*(uint32_t*)inm->b_rptr);
+               if (!s->snow_initialized){
+                       int error;
+-                      s->av_context.width=h>>16;
+-                      s->av_context.height=h&0xffff;
+-                      error=avcodec_open2(&s->av_context, s->av_codec, NULL);
++                      s->av_contextp->width=h>>16;
++                      s->av_contextp->height=h&0xffff;
++                      error=avcodec_open2(s->av_contextp, s->av_codec, NULL);
+                       if (error!=0) ms_error("avcodec_open() failed for snow: %i",error);
+                       else {
+                               s->snow_initialized=TRUE;
+                               ms_message("Snow decoder initialized,size=%ix%i",
+-                              s->av_context.width,
+-                              s->av_context.height);
++                              s->av_contextp->width,
++                              s->av_contextp->height);
+                       }
+               }
+               inm->b_rptr+=4;
+@@ -628,7 +634,7 @@
+ }
+ static mblk_t *get_as_yuvmsg(MSFilter *f, DecState *s, AVFrame *orig){
+-      AVCodecContext *ctx=&s->av_context;
++      AVCodecContext *ctx=s->av_contextp;
+       mblk_t *yuv_msg;
+       if (ctx->width==0 || ctx->height==0){
+@@ -662,7 +668,7 @@
+ #endif
+               ms_error("%s: error in ms_sws_scale().",f->desc->name);
+       }
+-      mblk_set_timestamp_info(yuv_msg, (uint32_t)orig->pkt_pts);
++      mblk_set_timestamp_info(yuv_msg, (uint32_t)orig->pts);
+       return yuv_msg;
+ }
+ /* Bitmasks to select bits of a byte from low side */
+@@ -671,7 +677,7 @@
+ static void dec_process_frame(MSFilter *f, mblk_t *inm){
+       DecState *s=(DecState*)f->data;
+-      int got_picture;
++      int got_picture = 0;
+       /* get a picture from the input queue */
+       if (f->desc->id==MS_H263_DEC_ID) inm=skip_rfc2429_header(inm);
+@@ -720,12 +726,27 @@
+                               pkt.data = frame->b_rptr;
+                               pkt.size = remain;
+                               pkt.pts = frame_ts;
+-                              len=avcodec_decode_video2(&s->av_context, s->orig, &got_picture,&pkt);
+-
+-                              if (len<=0) {
+-                                      ms_warning("ms_AVdecoder_process: error %i.",len);
+-                                      ms_filter_notify_no_arg(f,MS_VIDEO_DECODER_DECODING_ERRORS);
+-                                      break;
++                              {
++                                      int ret1 = avcodec_send_packet(s->av_contextp, &pkt), ret2;
++                                      char errmsg[AV_ERROR_MAX_STRING_SIZE];
++                                      if (ret1 < 0) {
++                                              av_strerror(ret1, errmsg, sizeof(errmsg));
++                                              ms_warning("ms_AVdecoder_process: avcodec_send_packet failed: %s.",errmsg);
++                                      } else {
++                                              ret2 = avcodec_receive_frame(s->av_contextp, s->orig);
++                                              if (ret2 < 0) {
++                                                      av_strerror(ret2, errmsg, sizeof(errmsg));
++                                                      ms_warning("ms_AVdecoder_process: avcodec_receive_frame failed: %s.",errmsg);
++                                              } else {
++                                                      got_picture=1;
++                                              }
++                                      }
++                                      if (ret1 == 0 && ret2 == 0)
++                                              len = pkt.size;
++                                      else {
++                                              ms_filter_notify_no_arg(f,MS_VIDEO_DECODER_DECODING_ERRORS);
++                                              break;
++                                      }
+                               }
+                               if (got_picture) {
+                                       mblk_t *om = get_as_yuvmsg(f,s,s->orig);
+--- a/src/videofilters/videoenc.c
++++ b/src/videofilters/videoenc.c
+@@ -37,6 +37,8 @@
+ #include "rfc2429.h"
++#include <libavutil/imgutils.h>
++#include <libavutil/opt.h>
+ #if LIBAVCODEC_VERSION_MAJOR >= 57
+@@ -129,7 +131,6 @@
+ void ms_ffmpeg_check_init(){
+       if(!avcodec_initialized){
+-              avcodec_register_all();
+               avcodec_initialized=TRUE;
+ #ifdef ENABLE_LOG_FFMPEG
+               av_log_set_level(AV_LOG_WARNING);
+@@ -139,8 +140,8 @@
+ }
+ typedef struct EncState{
+-      AVCodecContext av_context;
+-      AVCodec *av_codec;
++      AVCodecContext *av_contextp;
++      const AVCodec *av_codec;
+       AVFrame* pict;
+       enum CodecID codec;
+       mblk_t *comp_buf;
+@@ -243,7 +244,7 @@
+       s->qmin=2;
+       s->req_vfu=FALSE;
+       s->framenum=0;
+-      s->av_context.codec=NULL;
++      s->av_contextp->codec=NULL;
+       s->vconf_list = get_vconf_list(s);
+       s->vconf = ms_video_find_best_configuration_for_bitrate(s->vconf_list, 500000,ms_factory_get_cpu_count(f->factory));
+       s->pict = av_frame_alloc();
+@@ -265,11 +266,21 @@
+       enc_init(f,CODEC_ID_MJPEG);
+ }
++/*
++ * FIXME: With the ffmpeg 5.0 API this ought to return an error when
++ * allocation fails.
++ */
+ static void prepare(EncState *s){
+-      AVCodecContext *c=&s->av_context;
++      AVCodecContext *c=s->av_contextp;
+       const int max_br_vbv=128000;
+-      avcodec_get_context_defaults3(c, NULL);
++      if (s->av_contextp != NULL)
++              avcodec_free_context(&s->av_contextp);
++      s->av_contextp = avcodec_alloc_context3(NULL);
++      if (!s->av_contextp) {
++              ms_error("Could not allocate AVCodecContext.");
++              return;
++      }
+       if (s->codec==CODEC_ID_MJPEG)
+       {
+               ms_message("Codec bitrate set to %i",(int)c->bit_rate);
+@@ -327,13 +338,13 @@
+ }
+ static void prepare_h263(EncState *s){
+-      AVCodecContext *c=&s->av_context;
++      AVCodecContext *c=s->av_contextp;
+       /* we don't use the rtp_callback but use rtp_mode that forces ffmpeg to insert
+       Start Codes as much as possible in the bitstream */
+ #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
+         c->rtp_mode = 1;
+ #endif
+-      c->rtp_payload_size = s->mtu/2;
++      av_opt_set_int((struct MpegEncContext *) c->priv_data, "ps", s->mtu/2, 0);
+       if (s->profile==0){
+               s->codec=CODEC_ID_H263;
+       }else{
+@@ -349,7 +360,7 @@
+ }
+ static void prepare_mpeg4(EncState *s){
+-      AVCodecContext *c=&s->av_context;
++      AVCodecContext *c=s->av_contextp;
+       c->max_b_frames=0; /*don't use b frames*/
+ }
+@@ -383,22 +394,21 @@
+               ms_error("could not find encoder for codec id %i",s->codec);
+               return;
+       }
+-      error=avcodec_open2(&s->av_context, s->av_codec, NULL);
++      error=avcodec_open2(s->av_contextp, s->av_codec, NULL);
+       if (error!=0) {
+               ms_error("avcodec_open() failed: %i",error);
+               return;
+       }
+       ms_video_starter_init(&s->starter);
+-      ms_debug("image format is %i.",s->av_context.pix_fmt);
+-      ms_message("qmin=%i qmax=%i",s->av_context.qmin,s->av_context.qmax);
++      ms_debug("image format is %i.",s->av_contextp->pix_fmt);
++      ms_message("qmin=%i qmax=%i",s->av_contextp->qmin,s->av_contextp->qmax);
+       s->framenum=0;
+ }
+ static void enc_postprocess(MSFilter *f){
+       EncState *s=(EncState*)f->data;
+-      if (s->av_context.codec!=NULL){
+-              avcodec_close(&s->av_context);
+-              s->av_context.codec=NULL;
++      if (s->av_contextp->codec!=NULL){
++              avcodec_free_context(&s->av_contextp);
+       }
+       if (s->comp_buf!=NULL)  {
+               freemsg(s->comp_buf);
+@@ -469,7 +479,7 @@
+               /*frame->b_rptr=packet->b_wptr=packet->b_rptr+get_gbsc(packet->b_rptr, MIN(packet->b_rptr+s->mtu,frame->b_wptr));*/
+               frame->b_rptr = packet->b_wptr =
+                       packet->b_rptr + get_gbsc_bytealigned(packet->b_rptr, MIN(packet->b_rptr+s->mtu,frame->b_wptr));
+-              add_rfc2190_header(&packet, &s->av_context ,is_iframe);
++              add_rfc2190_header(&packet, s->av_contextp ,is_iframe);
+               mblk_set_timestamp_info(packet,timestamp);
+               ms_queue_put(f->outputs[0],packet);
+       }
+@@ -805,8 +815,8 @@
+ static void process_frame(MSFilter *f, mblk_t *inm){
+       EncState *s=(EncState*)f->data;
+-      AVCodecContext *c=&s->av_context;
+-      int error,got_packet;
++      AVCodecContext *c=s->av_contextp;
++      int got_packet=0;
+       mblk_t *comp_buf=s->comp_buf;
+       int comp_buf_sz= (int) (dblk_lim(comp_buf->b_datap)-dblk_base(comp_buf->b_datap));
+       YuvBuf yuv;
+@@ -816,7 +826,7 @@
+       ms_yuv_buf_init_from_mblk(&yuv, inm);
+       /* convert image if necessary */
+       av_frame_unref(s->pict);
+-      avpicture_fill((AVPicture*)s->pict,yuv.planes[0],c->pix_fmt,c->width,c->height);
++      av_image_fill_arrays(s->pict->data, s->pict->linesize, yuv.planes[0],c->pix_fmt,c->width,c->height, 32);
+       /* timestamp used by ffmpeg, unset here */
+       s->pict->pts=AV_NOPTS_VALUE;
+@@ -841,10 +851,21 @@
+ #endif
+       packet.data=comp_buf->b_wptr;
+       packet.size=comp_buf_sz;
+-      error=avcodec_encode_video2(c, &packet, s->pict, &got_packet);
+-
+-      if (error<0) ms_warning("ms_AVencoder_process: error %i.",error);
+-      else if (got_packet){
++      {
++              int ret1 = avcodec_send_frame(c, s->pict), ret2;
++              char errmsg[AV_ERROR_MAX_STRING_SIZE];
++              if (ret1 < 0) {
++                      av_strerror(ret1, errmsg, sizeof(errmsg));
++                      ms_warning("ms_AVencoder_process: avcodec_send_frame failed: %s.",errmsg);
++              } else {
++                      ret2 = avcodec_receive_packet(c, &packet);
++                      if (ret2 < 0) {
++                              av_strerror(ret2, errmsg, sizeof(errmsg));
++                              ms_warning("ms_AVencoder_process: avcodec_receive_packet failed: %s.",errmsg);
++                      } else got_packet=1;
++              }
++      }
++      if (got_packet){
+               bool_t is_iframe = FALSE;
+               s->framenum++;
+               if (s->framenum==1){
+@@ -867,7 +888,7 @@
+ static void enc_process(MSFilter *f){
+       mblk_t *inm;
+       EncState *s=(EncState*)f->data;
+-      if (s->av_context.codec==NULL) {
++      if (s->av_contextp && s->av_contextp->codec==NULL) {
+               ms_queue_flush(f->inputs[0]);
+               return;
+       }
+@@ -894,7 +915,7 @@
+       if (s->vconf.required_bitrate > s->vconf.bitrate_limit)
+               s->vconf.required_bitrate = s->vconf.bitrate_limit;
+-      if (s->av_context.codec != NULL) {
++      if (s->av_contextp && s->av_contextp->codec != NULL) {
+               /* Do not change video size if encoder is running */
+               if (!ms_video_size_equal(s->vconf.vsize, vsize)) {
+                       ms_warning("Video configuration: cannot change video size when encoder is running, actual=%dx%d, wanted=%dx%d", vsize.width, vsize.height, s->vconf.vsize.width, s->vconf.vsize.height);
+--- a/src/videofilters/h264dec.cpp
++++ b/src/videofilters/h264dec.cpp
+@@ -54,7 +54,7 @@
+       MSVideoSize vsize;
+       struct SwsContext *sws_ctx;
+       MSAverageFPS fps;
+-      AVCodecContext av_context;
++      AVCodecContext *av_contextp;
+       unsigned int packet_num;
+       uint8_t *bitstream;
+       int bitstream_size;
+@@ -67,18 +67,19 @@
+ static void ffmpeg_init(void){
+       static bool_t done=FALSE;
+       if (!done){
+-              avcodec_register_all();
+               done=TRUE;
+       }
+ }
+ static void dec_open(DecData *d){
+-      AVCodec *codec;
++      const AVCodec *codec=avcodec_find_decoder(CODEC_ID_H264);
+       int error;
+-      codec=avcodec_find_decoder(CODEC_ID_H264);
+       if (codec==NULL) ms_fatal("Could not find H264 decoder in ffmpeg.");
+-      avcodec_get_context_defaults3(&d->av_context, NULL);
+-      error=avcodec_open2(&d->av_context,codec, NULL);
++      d->av_contextp = avcodec_alloc_context3(codec);
++      if (!d->av_contextp) {
++              ms_fatal("Could not allocate AVCodecContext!");
++      }
++      error=avcodec_open2(d->av_contextp,codec, NULL);
+       if (error!=0){
+               ms_fatal("avcodec_open() failed.");
+       }
+@@ -114,7 +115,7 @@
+ }
+ static void dec_reinit(DecData *d){
+-      avcodec_close(&d->av_context);
++      avcodec_free_context(&d->av_contextp);
+       dec_open(d);
+ }
+@@ -126,7 +127,7 @@
+ static void dec_uninit(MSFilter *f){
+       DecData *d=(DecData*)f->data;
+       delete d->unpacker;
+-      avcodec_close(&d->av_context);
++      avcodec_free_context(&d->av_contextp);
+       if (d->sps) freemsg(d->sps);
+       if (d->pps) freemsg(d->pps);
+       if (d->orig) av_frame_free(&d->orig);
+@@ -137,7 +138,7 @@
+ }
+ static mblk_t *get_as_yuvmsg(MSFilter *f, DecData *s, AVFrame *orig){
+-      AVCodecContext *ctx=&s->av_context;
++      AVCodecContext *ctx=s->av_contextp;
+       MSPicture pic = {0};
+       mblk_t *yuv_msg;
+@@ -165,7 +166,7 @@
+               ms_error("%s: error in sws_scale().",f->desc->name);
+       }
+ #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(50,43,0) // backward compatibility with Debian Squeeze (6.0)
+-      mblk_set_timestamp_info(yuv_msg, (uint32_t)orig->pkt_pts);
++      mblk_set_timestamp_info(yuv_msg, (uint32_t)orig->pts);
+ #endif
+       return yuv_msg;
+ }
+@@ -326,9 +327,25 @@
+ #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(50,43,0) // backward compatibility with Debian Squeeze (6.0)
+                               pkt.pts = frame_ts;
+ #endif
+-                              len=avcodec_decode_video2(&d->av_context,d->orig,&got_picture,&pkt);
++                              {
++                                      len = -1;
++                                      char errmsg[AV_ERROR_MAX_STRING_SIZE];
++                                      int ret1 = avcodec_send_packet(d->av_contextp, &pkt), ret2;
++                                      if (ret1 < 0) {
++                                              av_strerror(ret1, errmsg, sizeof(errmsg));
++                                              ms_warning("ms_AVdecoder_process: avcodec_send_packet failed: %s.", errmsg);
++                                      } else {
++                                              ret2 = avcodec_receive_frame(d->av_contextp, d->orig);
++                                              if (ret2 < 0) {
++                                                      av_strerror(ret2, errmsg, sizeof(errmsg));
++                                                      ms_warning("ms_AVdecoder_process: avcodec_receive_frame failed: %s.",errmsg);
++                                              } else {
++                                                      got_picture=1;
++                                                      len = pkt.size;
++                                              }
++                                      }
++                              }
+                               if (len<=0) {
+-                                      ms_warning("ms_AVdecoder_process: error %i.",len);
+                                       ms_filter_notify_no_arg(f,MS_VIDEO_DECODER_DECODING_ERRORS);
+                                       requestPLI = TRUE;
+                                       break;
+--- a/src/utils/jpgloader-ffmpeg.c
++++ b/src/utils/jpgloader-ffmpeg.c
+@@ -62,7 +62,7 @@
+ mblk_t *jpeg2yuv(uint8_t *jpgbuf, int bufsize, MSVideoSize *reqsize){
+ #if !defined(NO_FFMPEG) && !TARGET_OS_IPHONE /* this code must never be used for iOS */
+-      AVCodecContext av_context;
++      AVCodecContext *av_contextp;
+       int got_picture=0;
+       mblk_t *ret;
+       struct SwsContext *sws_ctx;
+@@ -71,52 +71,77 @@
+       AVCodec *codec=avcodec_find_decoder(CODEC_ID_MJPEG);
+       AVFrame* orig = av_frame_alloc();
++      if (orig==NULL){
++              ms_error("Could not allocate AVFrame.");
++              return NULL;
++      }
++
+       if (codec==NULL){
+               ms_error("Could not find MJPEG decoder in ffmpeg.");
++              av_frame_free(&orig);
+               return NULL;
+       }
+-      avcodec_get_context_defaults3(&av_context,NULL);
+-      if (avcodec_open2(&av_context,codec,NULL)<0){
++      av_contextp = avcodec_alloc_context3(codec);
++      if (!av_contextp) {
++              ms_error("jpeg2yuv: avcodec_alloc_context3 failed");
++              av_frame_free(&orig);
++              return NULL;
++      }
++      if (avcodec_open2(av_contextp,codec,NULL)<0){
+               ms_error("jpeg2yuv: avcodec_open failed");
++              av_frame_free(&orig);
++              avcodec_free_context(&av_contextp);
+               return NULL;
+       }
+       av_init_packet(&pkt);
+       pkt.data=jpgbuf;
+       pkt.size=bufsize;
+-      if (avcodec_decode_video2(&av_context,orig,&got_picture,&pkt) < 0) {
+-              ms_error("jpeg2yuv: avcodec_decode_video failed");
+-              avcodec_close(&av_context);
++      int ret1 = avcodec_send_packet(av_contextp, &pkt), ret2;
++      if (ret1 < 0) {
++              ms_warning("jpeg2yuv: avcodec_send_packet failed: %s.",av_err2str(ret1));
++              av_frame_free(&orig);
++              avcodec_free_context(&av_contextp);
+               return NULL;
++      } else {
++              ret2 = avcodec_receive_frame(av_contextp, orig);
++              if (ret2 < 0) {
++                      ms_warning("jpeg2yuv: avcodec_receive_frame failed: %s.",av_err2str(ret2));
++                      av_frame_free(&orig);
++                      avcodec_free_context(&av_contextp);
++                      return NULL;
++              }
+       }
+       ret=ms_yuv_buf_alloc(&dest, reqsize->width,reqsize->height);
+       /* not using SWS_FAST_BILINEAR because it doesn't play well with
+        * av_context.pix_fmt set to AV_PIX_FMT_YUVJ420P by jpeg decoder */
+-      sws_ctx=sws_getContext(av_context.width,av_context.height,av_context.pix_fmt,
++      sws_ctx=sws_getContext(av_contextp->width,av_contextp->height,av_contextp->pix_fmt,
+               reqsize->width,reqsize->height,AV_PIX_FMT_YUV420P,SWS_BILINEAR,
+                 NULL, NULL, NULL);
+       if (sws_ctx==NULL) {
+               ms_error("jpeg2yuv: ms_sws_getContext() failed.");
+-              avcodec_close(&av_context);
++              av_frame_free(&orig);
++              avcodec_free_context(&av_contextp);
+               freemsg(ret);
+               return NULL;
+       }
+ #if LIBSWSCALE_VERSION_INT >= AV_VERSION_INT(0,9,0)
+-      if (sws_scale(sws_ctx,(const uint8_t* const *)orig->data,orig->linesize,0,av_context.height,dest.planes,dest.strides)<0){
++      if (sws_scale(sws_ctx,(const uint8_t* const *)orig->data,orig->linesize,0,av_contextp->height,dest.planes,dest.strides)<0){
+ #else
+-      if (sws_scale(sws_ctx,(uint8_t**)orig->data,orig->linesize,0,av_context.height,dest.planes,dest.strides)<0){
++      if (sws_scale(sws_ctx,(uint8_t**)orig->data,orig->linesize,0,av_contextp->height,dest.planes,dest.strides)<0){
+ #endif
+               ms_error("jpeg2yuv: ms_sws_scale() failed.");
+               sws_freeContext(sws_ctx);
+-              avcodec_close(&av_context);
++              av_frame_free(&orig);
++              avcodec_free_context(&av_contextp);
+               freemsg(ret);
+               return NULL;
+       }
+       sws_freeContext(sws_ctx);
+       av_frame_free(&orig);
+-      avcodec_close(&av_context);
++      avcodec_context_free(av_contextp);
+       return ret;
+ #elif TARGET_OS_IPHONE
+       MSPicture dest;
index a479f37cfaa6b064ed6e9b745eff5e10d750f53e..94b6be8b816429576b18c51c21a6c8c03961ce80 100644 (file)
@@ -27,7 +27,7 @@ Summary(pl.UTF-8):    PrzesyƂanie strumieni audio/video w czasie rzeczywistym
 Name:          mediastreamer
 # note: 5.2.x is AGPL-licensed; see DEVEL-5.2 branch
 Version:       5.2.109
-Release:       0.1
+Release:       0.2
 License:       GPL v3+
 Group:         Libraries
 #Source0Download: https://gitlab.linphone.org/BC/public/mediastreamer2/tags
@@ -41,6 +41,7 @@ Patch4:               %{name}-cmake-install-pkgconfig.patch
 Patch5:                %{name}-cmake-SDL.patch
 Patch6:                %{name}-types.patch
 Patch10:       %{name}-gcc.patch
+Patch11:       ffmpeg_5_0_fixes.patch
 URL:           http://www.linphone.org/technical-corner/mediastreamer2/overview
 %{?with_opengl:BuildRequires:  OpenGL-GLX-devel}
 %{?with_sdl:BuildRequires:     SDL-devel >= 1.2.0}
@@ -166,11 +167,12 @@ Statyczne biblioteki mediastreamer.
 %patch5 -p1
 %patch6 -p1
 %patch10 -p1
+%patch11 -p1
 
 # cmake checks for python3, so don't require python 2 as well
 %{__sed} -i -e '1s,/usr/bin/python$,%{__python3},' tools/xxd.py
 
-%{__sed} -i -e 's/"-Werror" /"-Werror" "-Wno-error=address"/' CMakeLists.txt
+%{__sed} -i -e 's/"-Werror" /"-Werror" "-Wno-error=address" "-Wno-error=unused-parameter"/' CMakeLists.txt
 
 %build
 install -d builddir
@@ -231,7 +233,7 @@ install -d $RPM_BUILD_ROOT%{_libdir}/mediastreamer/plugins
 # we don't need another copy
 %{__rm} -r $RPM_BUILD_ROOT%{_includedir}/OpenGL
 # Remove duplicated documentation
-%{__rm} -r $RPM_BUILD_ROOT/usr/share/doc/mediastreamer2-5.1.0/html
+%{__rm} -r $RPM_BUILD_ROOT/usr/share/doc/mediastreamer2-5.2.0/html
 
 %find_lang %{name}
 
This page took 0.18894 seconds and 4 git commands to generate.