Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions src/mod/applications/mod_av/avcodec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1227,8 +1227,14 @@ static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t widt

if (context->encoder_ctx) {
if (avcodec_is_open(context->encoder_ctx)) {
#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
avcodec_close(context->encoder_ctx);
#else
/* avcodec_close() will be called in avcodec_free_context() */
avcodec_free_context(&context->encoder_ctx);
#endif
}

av_free(context->encoder_ctx);
context->encoder_ctx = NULL;
}
Expand Down Expand Up @@ -1320,8 +1326,14 @@ FF_ENABLE_DEPRECATION_WARNINGS

if (context->encoder_ctx) {
if (avcodec_is_open(context->encoder_ctx)) {
#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
avcodec_close(context->encoder_ctx);
#else
/* avcodec_close() will be called in avcodec_free_context() */
avcodec_free_context(&context->encoder_ctx);
#endif
}

av_free(context->encoder_ctx);
context->encoder_ctx = NULL;
}
Expand Down Expand Up @@ -1557,7 +1569,11 @@ static switch_status_t switch_h264_encode(switch_codec_t *codec, switch_frame_t
}

avframe->pict_type = AV_PICTURE_TYPE_I;
#if ((LIBAVCODEC_VERSION_MAJOR == LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V) || LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_7_V)
avframe->flags |= AV_FRAME_FLAG_KEY;
#else
avframe->key_frame = 1;
#endif
context->last_keyframe_request = switch_time_now();
}

Expand Down Expand Up @@ -1600,9 +1616,14 @@ GCC_DIAG_ON(deprecated-declarations)
}
#endif

#if ((LIBAVCODEC_VERSION_MAJOR == LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V) || LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_7_V)
if (context->need_key_frame && (avframe->flags & AV_FRAME_FLAG_KEY)) {
avframe->flags &= ~AV_FRAME_FLAG_KEY;
#else
if (context->need_key_frame && avframe->key_frame == 1) {
avframe->pict_type = 0;
avframe->key_frame = 0;
#endif
avframe->pict_type = 0;
context->need_key_frame = 0;
}

Expand Down Expand Up @@ -1862,14 +1883,30 @@ static switch_status_t switch_h264_destroy(switch_codec_t *codec)

switch_buffer_destroy(&context->nalu_buffer);
if (context->decoder_ctx) {
if (avcodec_is_open(context->decoder_ctx)) avcodec_close(context->decoder_ctx);
if (avcodec_is_open(context->decoder_ctx)) {
#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
avcodec_close(context->decoder_ctx);
#else
/* avcodec_close() will be called in avcodec_free_context() */
avcodec_free_context(&context->decoder_ctx);
#endif
}

av_free(context->decoder_ctx);
}

switch_img_free(&context->img);

if (context->encoder_ctx) {
if (avcodec_is_open(context->encoder_ctx)) avcodec_close(context->encoder_ctx);
if (avcodec_is_open(context->encoder_ctx)) {
#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
avcodec_close(context->encoder_ctx);
#else
/* avcodec_close() will be called in avcodec_free_context() */
avcodec_free_context(&context->encoder_ctx);
#endif
}

av_free(context->encoder_ctx);
}

Expand Down
47 changes: 46 additions & 1 deletion src/mod/applications/mod_av/avformat.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,7 @@ static int interrupt_cb(void *cp)
}


#if (LIBAVFORMAT_VERSION_MAJOR < LIBAVFORMAT_6_V)
static int mod_avformat_alloc_output_context2(AVFormatContext **avctx, const char *format, const char *filename, av_file_context_t *context)
{
AVFormatContext *s = avformat_alloc_context();
Expand Down Expand Up @@ -489,6 +490,7 @@ static int mod_avformat_alloc_output_context2(AVFormatContext **avctx, const cha

return ret;
}
#endif

static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
{
Expand Down Expand Up @@ -555,7 +557,21 @@ static switch_status_t add_stream(av_file_context_t *context, MediaStream *mst,

switch ((*codec)->type) {
case AVMEDIA_TYPE_AUDIO:
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100)
/*
Changelog says 61.12.100 but commit changes version actually to 61.13.100
https://github.com/FFmpeg/FFmpeg/commit/3305767560a6303f474fffa3afb10c500059b455
*/
{
const enum AVSampleFormat *sample_fmts = NULL;
int fmts_count = 0;
int ret = avcodec_get_supported_config(c, *codec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, (const void**)&sample_fmts, &fmts_count);

c->sample_fmt = (ret >= 0 && fmts_count && sample_fmts) ? sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
}
#else
c->sample_fmt = (*codec)->sample_fmts ? (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
#endif
c->bit_rate = 128000;
c->sample_rate = mst->sample_rate = context->handle->samplerate;
#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_V)
Expand Down Expand Up @@ -621,8 +637,13 @@ static switch_status_t add_stream(av_file_context_t *context, MediaStream *mst,
c->rc_initial_buffer_occupancy = buffer_bytes * 8;

if (codec_id == AV_CODEC_ID_H264) {
#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
GCC_DIAG_OFF(deprecated-declarations)
#endif
c->ticks_per_frame = 2;

#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
GCC_DIAG_ON(deprecated-declarations)
#endif

c->flags|=AV_CODEC_FLAG_LOOP_FILTER; // flags=+loop
c->me_cmp|= 1; // cmp=+chroma, where CHROMA = 1
Expand Down Expand Up @@ -1410,7 +1431,11 @@ static switch_status_t open_input_file(av_file_context_t *context, switch_file_h
switch_goto_status(SWITCH_STATUS_FALSE, err);
}

#if (LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
handle->seekable = !(context->fc->iformat->flags & AVFMT_NOTIMESTAMPS);
#else
handle->seekable = context->fc->iformat->read_seek2 ? 1 : (context->fc->iformat->read_seek ? 1 : 0);
#endif
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "file %s is %sseekable\n", filename, handle->seekable ? "" : "not ");

/** Get information on the input file (number of streams etc.). */
Expand Down Expand Up @@ -1502,7 +1527,12 @@ static switch_status_t open_input_file(av_file_context_t *context, switch_file_h

switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open input audio codec channel 2 (error '%s')\n", get_error_text(error, ebuf, sizeof(ebuf)));
if ((cc = av_get_codec_context(&context->audio_st[0]))) {
#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
avcodec_close(cc);
#else
/* avcodec_close() will be called in avcodec_free_context() */
avcodec_free_context(&cc);
#endif
}

context->has_audio = 0;
Expand Down Expand Up @@ -2235,7 +2265,16 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa
return SWITCH_STATUS_SUCCESS;
}

#if (LIBAVFORMAT_VERSION_MAJOR < LIBAVFORMAT_6_V)
mod_avformat_alloc_output_context2(&context->fc, format, (char *)file, context);
#else
avformat_alloc_output_context2(&context->fc, NULL, format, (char *)file);

if (context->fc) {
context->fc->interrupt_callback.callback = interrupt_cb;
context->fc->interrupt_callback.opaque = context;
}
#endif

if (!context->fc) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Could not deduce output format from file extension\n");
Expand Down Expand Up @@ -3201,6 +3240,9 @@ static switch_status_t av_file_read_video(switch_file_handle_t *handle, switch_f

if ((c = av_get_codec_context(mst)) && c->time_base.num) {
cp = av_stream_get_parser(st);
#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
GCC_DIAG_OFF(deprecated-declarations)
#endif
ticks = cp ? cp->repeat_pict + 1 : c->ticks_per_frame;
// mst->next_pts += ((int64_t)AV_TIME_BASE * st->codec->time_base.num * ticks) / st->codec->time_base.den;
}
Expand All @@ -3210,6 +3252,9 @@ static switch_status_t av_file_read_video(switch_file_handle_t *handle, switch_f
context->video_start_time, ticks, c ? c->ticks_per_frame : -1, st->time_base.num, st->time_base.den, c ? c->time_base.num : -1, c ? c->time_base.den : -1,
st->start_time, st->duration == AV_NOPTS_VALUE ? context->fc->duration / AV_TIME_BASE * 1000 : st->duration, st->nb_frames, av_q2d(st->time_base));
}
#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
GCC_DIAG_ON(deprecated-declarations)
#endif

again:

Expand Down
12 changes: 9 additions & 3 deletions src/mod/applications/mod_av/mod_av.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,15 @@
#ifndef MOD_AV_H
#define MOD_AV_H

#define LIBAVCODEC_V 59
#define LIBAVFORMAT_V 59
#define LIBAVUTIL_V 57
#define LIBAVCODEC_V 59 /* FFmpeg version >= 5.1 */
#define LIBAVCODEC_6_V 60 /* FFmpeg version >= 6.0 */
#define LIBAVCODEC_7_V 61 /* FFmpeg version >= 7.0 */
#define LIBAVCODEC_61_V 31 /* FFmpeg version >= 6.1 */
#define LIBAVFORMAT_V 59 /* FFmpeg version >= 5.1 */
#define LIBAVFORMAT_6_V 60 /* FFmpeg version >= 6.0 */
#define LIBAVFORMAT_7_V 61 /* FFmpeg version >= 7.0 */
#define LIBAVFORMAT_61_V 16 /* FFmpeg version >= 6.1 */
#define LIBAVUTIL_V 57 /* FFmpeg version >= 5.1 */

struct mod_av_globals {
int debug;
Expand Down
Loading