]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
remove unused function and migrate from AVBitStreamFilterContext to AVBSFContext
authoralingherghescu <alin_gherghescu@yahoo.com>
Thu, 16 Mar 2023 19:13:05 +0000 (12:13 -0700)
committerFlole998 <Flole998@users.noreply.github.com>
Thu, 23 Mar 2023 02:24:20 +0000 (03:24 +0100)
- migrate from AVBitStreamFilterContext to AVBSFContext
- update AVCodec to 'const AVCodec'
- remove unused function: libav_is_encoder()
- remove deprecated functions:
-- AVFormatContext->filename
-- av_register_all() --> https://github.com/FFmpeg/FFmpeg/blob/master/doc/APIchanges (2018-02-06 - 0694d87024 - lavf 58.9.100 - avformat.h)
-- avfilter_register_all() --> https://github.com/FFmpeg/FFmpeg/blob/master/doc/APIchanges (2018-04-01 - f1805d160d - lavfi 7.14.100 - avfilter.h)

src/libav.c
src/libav.h
src/muxer/muxer_libav.c

index 2827135713acf1322c838760bc5fa7e5dd38a6c3..c633d05c920336fa2937aff18ba3eeeb6f850f9b 100644 (file)
@@ -222,19 +222,6 @@ codec_id2streaming_component_type(enum AVCodecID id)
 }
 
 
-/**
- *
- */
-int
-libav_is_encoder(AVCodec *codec)
-{
-#if LIBAVCODEC_VERSION_INT >= ((54<<16)+(7<<8)+0)
-  return av_codec_is_encoder(codec);
-#else
-  return codec->encode || codec->encode2;
-#endif
-}
-
 /**
  *
  */
@@ -325,9 +312,7 @@ libav_init(void)
   libav_vaapi_init();
   libav_set_loglevel();
   av_log_set_callback(libav_log_callback);
-  av_register_all();
   avformat_network_init();
-  avfilter_register_all();
   transcode_init();
 }
 
index ea9af51693eb7aaa8d742b776a945d55ece454c6..c73b61089e6368020378c37e05440038a669dcb0 100644 (file)
@@ -56,7 +56,6 @@ This list must be updated every time we use a new AV_CODEC_ID
 
 enum AVCodecID streaming_component_type2codec_id(streaming_component_type_t type);
 streaming_component_type_t codec_id2streaming_component_type(enum AVCodecID id);
-int libav_is_encoder(AVCodec *codec);
 void libav_set_loglevel(void);
 void libav_vaapi_init_context(void *context);
 void libav_init(void);
index 69668eddf1ffa7f5cdcffb21d7dd40fd9ee0118e..9650a181639ad990dde266b10c3695b8efa14fa2 100644 (file)
 typedef struct lav_muxer {
   muxer_t;
   AVFormatContext *lm_oc;
-  AVBitStreamFilterContext *lm_h264_filter;
-  AVBitStreamFilterContext *lm_hevc_filter;
+  AVBSFContext *ctx;
+  const AVBitStreamFilter *bsf_h264_filter;
+  const AVBitStreamFilter *bsf_hevc_filter;
+  const AVBitStreamFilter *bsf_vp9_filter;
   int lm_fd;
   int lm_init;
 } lav_muxer_t;
@@ -80,7 +82,8 @@ lav_muxer_add_stream(lav_muxer_t *lm,
 {
   AVStream *st;
   AVCodecContext *c;
-  AVCodec *codec; 
+  const AVCodec *codec; 
+  int rc = -1;
 
   st = avformat_new_stream(lm->lm_oc, NULL);
   if (!st)
@@ -172,6 +175,39 @@ lav_muxer_add_stream(lav_muxer_t *lm,
     st->sample_aspect_ratio.num = c->sample_aspect_ratio.num;
     st->sample_aspect_ratio.den = c->sample_aspect_ratio.den;
 
+    if (ssc->es_type == SCT_H264) {
+      if (av_bsf_alloc(lm->bsf_h264_filter, &lm->ctx)) {
+        tvherror(LS_LIBAV,  "Failed to alloc AVBitStreamFilter for h264_mp4toannexb");
+        goto fail;
+      }
+    }
+    else if (ssc->es_type == SCT_HEVC) {
+      if (av_bsf_alloc(lm->bsf_hevc_filter, &lm->ctx)) {
+        tvherror(LS_LIBAV,  "Failed to alloc AVBitStreamFilter for hevc_mp4toannexb");
+        goto fail;
+      }
+    }
+    else if (ssc->es_type == SCT_VP9) {
+      if (av_bsf_alloc(lm->bsf_vp9_filter, &lm->ctx)) {
+        tvherror(LS_LIBAV,  "Failed to alloc AVBitStreamFilter for vp9_superframe ");
+        goto fail;
+      }
+    }
+    else {
+      if (av_bsf_alloc(lm->bsf_h264_filter, &lm->ctx)) {
+        tvherror(LS_LIBAV,  "Failed to alloc AVBitStreamFilter for h264_mp4toannexb");
+        goto fail;
+      }
+    }
+    if(avcodec_parameters_copy(lm->ctx->par_in, st->codecpar)) {
+      tvherror(LS_LIBAV,  "Failed to copy paramters to AVBSFContext");
+      goto fail;
+    }
+    lm->ctx->time_base_in = st->time_base;
+    if (av_bsf_init(lm->ctx)) {
+      tvherror(LS_LIBAV,  "Failed to init AVBSFContext");
+      goto fail;
+    }
   } else if(SCT_ISSUBTITLE(ssc->es_type)) {
     c->codec_type = AVMEDIA_TYPE_SUBTITLE;
     avcodec_parameters_from_context(st->codecpar, c);
@@ -180,11 +216,13 @@ lav_muxer_add_stream(lav_muxer_t *lm,
 
   if(lm->lm_oc->oformat->flags & AVFMT_GLOBALHEADER)
     c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+  rc = 0;
 
-  avcodec_parameters_from_context(st->codecpar, c);
+fail:
+  av_freep(&c->extradata);
   avcodec_free_context(&c);
 
-  return 0;
+  return rc;
 }
 
 
@@ -307,6 +345,7 @@ lav_muxer_init(muxer_t* m, struct streaming_start *ss, const char *name)
   char app[128];
   AVOutputFormat *fmt;
   const char *muxer_name;
+  int rc = -1;
 
   snprintf(app, sizeof(app), "Tvheadend %s", tvheadend_version);
 
@@ -343,9 +382,17 @@ lav_muxer_init(muxer_t* m, struct streaming_start *ss, const char *name)
   av_dict_set(&oc->metadata, "service_name", name, 0);
   av_dict_set(&oc->metadata, "service_provider", app, 0);
 
-  if(lm->m_config.m_type == MC_MPEGTS) {
-    lm->lm_h264_filter = av_bitstream_filter_init("h264_mp4toannexb");
-    lm->lm_hevc_filter = av_bitstream_filter_init("hevc_mp4toannexb");
+  lm->bsf_h264_filter = av_bsf_get_by_name("h264_mp4toannexb");
+  if (lm->bsf_h264_filter == NULL) {
+    tvhwarn(LS_LIBAV,  "Failed to get BSF: h264_mp4toannexb");
+  }
+  lm->bsf_hevc_filter = av_bsf_get_by_name("hevc_mp4toannexb");
+  if (lm->bsf_h264_filter == NULL) {
+    tvhwarn(LS_LIBAV,  "Failed to get BSF: hevc_mp4toannexb");
+  }
+  lm->bsf_vp9_filter = av_bsf_get_by_name("vp9_superframe");
+  if (lm->bsf_vp9_filter == NULL) {
+    tvhwarn(LS_LIBAV,  "Failed to get BSF: vp9_superframe ");
   }
 
   oc->max_delay = 0.7 * AV_TIME_BASE;
@@ -380,20 +427,22 @@ lav_muxer_init(muxer_t* m, struct streaming_start *ss, const char *name)
   if(!lm->lm_oc->nb_streams) {
     tvherror(LS_LIBAV,  "No supported streams available");
     lm->m_errors++;
-    return -1;
+    goto fail;
   } else if(avformat_write_header(lm->lm_oc, &opts) < 0) {
     tvherror(LS_LIBAV,  "Failed to write %s header", 
             muxer_container_type2txt(lm->m_config.m_type));
     lm->m_errors++;
-    return -1;
+    goto fail;
   }
 
+  lm->lm_init = 1;
+  rc = 0;
+
+fail:
   if (opts)
     av_dict_free(&opts);
 
-  lm->lm_init = 1;
-
-  return 0;
+  return rc;
 }
 
 
@@ -442,7 +491,6 @@ lav_muxer_open_file(muxer_t *m, const char *filename)
 
   lm->lm_fd = -1;
   oc = lm->lm_oc;
-  snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
 
   if((r = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
     av_strerror(r, buf, sizeof(buf));
@@ -502,29 +550,9 @@ lav_muxer_write_pkt(muxer_t *m, streaming_message_type_t smt, void *data)
 
     tofree = NULL;
     av_init_packet(&packet);
-    codec_id = st->codec->codec_id;
-
-    if((lm->lm_h264_filter && codec_id == AV_CODEC_ID_H264) ||
-       (lm->lm_hevc_filter && codec_id == AV_CODEC_ID_HEVC)) {
-      pkt = avc_convert_pkt(opkt = pkt);
-      pkt_ref_dec(opkt);
-      if(av_bitstream_filter_filter(st->codec->codec_id == AV_CODEC_ID_H264 ?
-                                      lm->lm_h264_filter : lm->lm_hevc_filter,
-                                   st->codec, 
-                                   NULL, 
-                                   &packet.data, 
-                                   &packet.size, 
-                                   pktbuf_ptr(pkt->pkt_payload), 
-                                   pktbuf_len(pkt->pkt_payload), 
-                                   SCT_ISVIDEO(pkt->pkt_type) ? pkt->v.pkt_frametype < PKT_P_FRAME : 1) < 0) {
-       tvhwarn(LS_LIBAV,  "Failed to filter bitstream");
-       if (packet.data != pktbuf_ptr(pkt->pkt_payload))
-         av_free(packet.data);
-       break;
-      } else {
-        tofree = packet.data;
-      }
-    } else if (codec_id == AV_CODEC_ID_AAC) {
+    codec_id = st->codecpar->codec_id;
+
+    if (codec_id == AV_CODEC_ID_AAC) {
       /* remove ADTS header */
       packet.data = pktbuf_ptr(pkt->pkt_payload) + 7;
       packet.size = pktbuf_len(pkt->pkt_payload) - 7;
@@ -631,15 +659,15 @@ lav_muxer_destroy(muxer_t *m)
   int i;
   lav_muxer_t *lm = (lav_muxer_t*)m;
 
-  if(lm->lm_h264_filter)
-    av_bitstream_filter_close(lm->lm_h264_filter);
-
-  if(lm->lm_hevc_filter)
-    av_bitstream_filter_close(lm->lm_hevc_filter);
+  if(lm->ctx){
+    if (av_bsf_send_packet(lm->ctx, NULL))
+      tvhwarn(LS_LIBAV,  "Failed to send packet to AVBSFContext (close)");
+    av_bsf_free(&lm->ctx);
+  }
 
   if (lm->lm_oc) {
     for(i=0; i<lm->lm_oc->nb_streams; i++)
-      av_freep(&lm->lm_oc->streams[i]->codec->extradata);
+      av_freep(&lm->lm_oc->streams[i]->codecpar->extradata);
   }
 
   if(lm->lm_oc) {