From: alingherghescu Date: Thu, 16 Mar 2023 19:13:05 +0000 (-0700) Subject: remove unused function and migrate from AVBitStreamFilterContext to AVBSFContext X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0acb338a762afbd46658fadc55ae3e6827c5b73a;p=thirdparty%2Ftvheadend.git remove unused function and migrate from AVBitStreamFilterContext to AVBSFContext - 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) --- diff --git a/src/libav.c b/src/libav.c index 282713571..c633d05c9 100644 --- a/src/libav.c +++ b/src/libav.c @@ -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(); } diff --git a/src/libav.h b/src/libav.h index ea9af5169..c73b61089 100644 --- a/src/libav.h +++ b/src/libav.h @@ -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); diff --git a/src/muxer/muxer_libav.c b/src/muxer/muxer_libav.c index 69668eddf..9650a1816 100644 --- a/src/muxer/muxer_libav.c +++ b/src/muxer/muxer_libav.c @@ -35,8 +35,10 @@ 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; ilm_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) {