From 3d1260bdb773c8eaebbedc57d56fccecc896b144 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 23 May 2012 13:31:58 +1000 Subject: [PATCH] Move myth libavformat/utils.c mods into libavformat/utils-myth.c Try to keep all our modifications localised, so the original libavformat/utils.c has the minimum amount of differences as possible. Hoping to simplify future resync --- mythtv/external/FFmpeg/libavformat/Makefile | 1 + mythtv/external/FFmpeg/libavformat/avformat.h | 16 +- .../external/FFmpeg/libavformat/utils-myth.c | 160 ++++++++++++++++++ mythtv/external/FFmpeg/libavformat/utils.c | 142 +--------------- 4 files changed, 175 insertions(+), 144 deletions(-) create mode 100644 mythtv/external/FFmpeg/libavformat/utils-myth.c diff --git a/mythtv/external/FFmpeg/libavformat/Makefile b/mythtv/external/FFmpeg/libavformat/Makefile index c9ebc50f845..2fa5c5b4fed 100644 --- a/mythtv/external/FFmpeg/libavformat/Makefile +++ b/mythtv/external/FFmpeg/libavformat/Makefile @@ -18,6 +18,7 @@ OBJS = allformats.o \ sdp.o \ seek.o \ utils.o \ + utils-myth.o \ OBJS-$(CONFIG_NETWORK) += network.o diff --git a/mythtv/external/FFmpeg/libavformat/avformat.h b/mythtv/external/FFmpeg/libavformat/avformat.h index 64c16948f58..c1d04128edb 100644 --- a/mythtv/external/FFmpeg/libavformat/avformat.h +++ b/mythtv/external/FFmpeg/libavformat/avformat.h @@ -1102,7 +1102,6 @@ typedef struct AVPacketList { struct AVPacketList *next; } AVPacketList; -#define MAX_STREAMS 100 /** * @defgroup lavf_core Core functions @@ -1563,10 +1562,6 @@ void av_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den); #endif -void av_estimate_timings(AVFormatContext *ic, int64_t old_offset); -AVStream *av_add_stream(AVFormatContext *s, AVStream *st, int id); -void av_remove_stream(AVFormatContext *s, int id, int remove_ts); - #define AVSEEK_FLAG_BACKWARD 1 ///< seek backward #define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes #define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes @@ -1924,6 +1919,17 @@ const struct AVCodecTag *avformat_get_riff_audio_tags(void); * @} */ +/* MythTV changes */ + +#define MAX_STREAMS 100 + +void estimate_timings(AVFormatContext *ic, int64_t old_offset); +void av_estimate_timings(AVFormatContext *ic, int64_t old_offset); +AVStream *av_add_stream(AVFormatContext *s, AVStream *st, int id); +void av_remove_stream(AVFormatContext *s, int id, int remove_ts); +void flush_packet_queue(AVFormatContext *s); +/* End MythTV changes */ + /** * @} */ diff --git a/mythtv/external/FFmpeg/libavformat/utils-myth.c b/mythtv/external/FFmpeg/libavformat/utils-myth.c new file mode 100644 index 00000000000..a35e6cc680a --- /dev/null +++ b/mythtv/external/FFmpeg/libavformat/utils-myth.c @@ -0,0 +1,160 @@ +/* + * MPEG2 transport utilities + * Copyright (c) 2002-2012 The MythTV Team + * + * This file is part of MythTV. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avformat.h" +#include "mpegts-mythtv.h" + +#ifdef _WIN32 +#define gmtime_r(X, Y) (memcpy(Y, gmtime(X), sizeof(struct tm)), Y) +#define localtime_r(X, Y) (memcpy(Y, localtime(X), sizeof(struct tm)), Y) +#endif + + +/** + * @brief Add a stream to an MPEG media stream. + * + * This is used by mpegts instead of av_new_stream, so we can + * track new streams as indicated by the PMT. + * + * @param s MPEG media stream handle + * @param st new media stream + * @param id file format dependent stream id + */ +AVStream *av_add_stream(AVFormatContext *s, AVStream *st, int id) +{ + int i; + + if (!st) + { + av_log(s, AV_LOG_ERROR, "av_add_stream: Error, AVStream is NULL"); + return NULL; + } + + av_remove_stream(s, id, 0); + + if (s->nb_streams >= MAX_STREAMS) + { + av_log(s, AV_LOG_ERROR, "av_add_stream: Error, (s->nb_streams >= MAX_STREAMS)"); + return NULL; + } + + if (s->iformat) { + /* no default bitrate if decoding */ + st->codec->bit_rate = 0; + } + st->index = s->nb_streams; + st->id = id; + st->start_time = AV_NOPTS_VALUE; + st->duration = AV_NOPTS_VALUE; + st->cur_dts = AV_NOPTS_VALUE; + st->first_dts = AV_NOPTS_VALUE; + + /* default pts settings is MPEG like */ + av_set_pts_info(st, 33, 1, 90000); + st->last_IP_pts = AV_NOPTS_VALUE; + for(i=0; ipts_buffer[i]= AV_NOPTS_VALUE; + + s->streams[s->nb_streams++] = st; + return st; +} + + +/** + * @brief Remove a stream from a media stream. + * + * This is used by mpegts, so we can track streams as indicated by the PMT. + * + * @param s MPEG media stream handle + * @param id stream id of stream to remove + * @param remove_ts if true, remove any matching MPEG-TS filter as well + */ +void av_remove_stream(AVFormatContext *s, int id, int remove_ts) { + int i; + int changes = 0; + + for (i=0; inb_streams; i++) { + if (s->streams[i]->id != id) + continue; + + av_log(NULL, AV_LOG_DEBUG, "av_remove_stream 0x%x\n", id); + + /* close codec context */ + AVCodecContext *codec_ctx = s->streams[i]->codec; + if (codec_ctx->codec) { + avcodec_close(codec_ctx); + av_free(codec_ctx); + } +#if 0 + /* make sure format context is not using the codec context */ + if (&s->streams[i] == s->cur_st) { + av_log(NULL, AV_LOG_DEBUG, "av_remove_stream cur_st = NULL\n"); + s->cur_st = NULL; + } +#endif + /* else if (s->cur_st > &s->streams[i]) { + av_log(NULL, AV_LOG_DEBUG, "av_remove_stream cur_st -= 1\n"); + s->cur_st -= sizeof(AVFormatContext *); + } */ + else { + av_log(NULL, AV_LOG_DEBUG, + "av_remove_stream: no change to cur_st\n"); + } + + av_log(NULL, AV_LOG_DEBUG, "av_remove_stream: removing... " + "s->nb_streams=%d i=%d\n", s->nb_streams, i); + /* actually remove av stream */ + s->nb_streams--; + if ((s->nb_streams - i) > 0) { + memmove(&s->streams[i], &s->streams[i+1], + (s->nb_streams-i)*sizeof(AVFormatContext *)); + } + else + s->streams[i] = NULL; + + /* remove ts filter if remove ts is true and + * the format decoder is the "mpegts" decoder + */ + if (remove_ts && s->iformat && s->priv_data && + (0 == strncmp(s->iformat->name, "mpegts", 6))) { + av_log(NULL, AV_LOG_DEBUG, + "av_remove_stream: mpegts_remove_stream\n"); + MpegTSContext *context = (MpegTSContext*) s->priv_data; + mpegts_remove_stream(context, id); + } + changes = 1; + } + if (changes) + { + // flush queued packets after a stream change (might need to make smarter) + flush_packet_queue(s); + + /* renumber the streams */ + av_log(NULL, AV_LOG_DEBUG, "av_remove_stream: renumbering streams\n"); + for (i=0; inb_streams; i++) + s->streams[i]->index=i; + } +} + +void av_estimate_timings(AVFormatContext *ic, int64_t old_offset) +{ + return estimate_timings(ic, old_offset); +} diff --git a/mythtv/external/FFmpeg/libavformat/utils.c b/mythtv/external/FFmpeg/libavformat/utils.c index fad6c800c67..2856646234c 100644 --- a/mythtv/external/FFmpeg/libavformat/utils.c +++ b/mythtv/external/FFmpeg/libavformat/utils.c @@ -39,7 +39,6 @@ #include "libavutil/parseutils.h" #include "riff.h" #include "audiointerleave.h" -#include "mpegts-mythtv.h" #include "url.h" #include #include @@ -48,11 +47,6 @@ #include "network.h" #endif -#ifdef _WIN32 -#define gmtime_r(X, Y) (memcpy(Y, gmtime(X), sizeof(struct tm)), Y) -#define localtime_r(X, Y) (memcpy(Y, localtime(X), sizeof(struct tm)), Y) -#endif - #undef NDEBUG #include @@ -1438,7 +1432,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) } /* XXX: suppress the packet queue */ -static void flush_packet_queue(AVFormatContext *s) +void flush_packet_queue(AVFormatContext *s) { free_packet_buffer(&s->parse_queue, &s->parse_queue_end); free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end); @@ -2254,11 +2248,6 @@ void estimate_timings(AVFormatContext *ic, int64_t old_offset) } } -void av_estimate_timings(AVFormatContext *ic, int64_t old_offset) -{ - return estimate_timings(ic, old_offset); -} - static int has_codec_parameters(AVStream *st) { AVCodecContext *avctx = st->codec; @@ -2463,13 +2452,13 @@ int av_find_stream_info(AVFormatContext *ic) int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) { - int i, count, ret, read_size, j, read_packets = 0; + int i, count, ret, read_size, j; AVStream *st; AVPacket pkt1, *pkt; int64_t old_offset = avio_tell(ic->pb); int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those int flush_codecs = 1; - int hasaudio = 0, hasvideo = 0; + int hasaudio = 0, hasvideo = 0, read_packets = 0; for(i=0;inb_streams;i++) { AVCodec *codec; @@ -3012,54 +3001,6 @@ AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) st->reference_dts = AV_NOPTS_VALUE; st->sample_aspect_ratio = (AVRational){0,1}; - s->streams[s->nb_streams++] = st; - return st; -} - -/** - * @brief Add a stream to an MPEG media stream. - * - * This is used by mpegts instead of av_new_stream, so we can - * track new streams as indicated by the PMT. - * - * @param s MPEG media stream handle - * @param st new media stream - * @param id file format dependent stream id - */ -AVStream *av_add_stream(AVFormatContext *s, AVStream *st, int id) -{ - int i; - - if (!st) - { - av_log(s, AV_LOG_ERROR, "av_add_stream: Error, AVStream is NULL"); - return NULL; - } - - av_remove_stream(s, id, 0); - - if (s->nb_streams >= MAX_STREAMS) - { - av_log(s, AV_LOG_ERROR, "av_add_stream: Error, (s->nb_streams >= MAX_STREAMS)"); - return NULL; - } - - if (s->iformat) { - /* no default bitrate if decoding */ - st->codec->bit_rate = 0; - } - st->index = s->nb_streams; - st->id = id; - st->start_time = AV_NOPTS_VALUE; - st->duration = AV_NOPTS_VALUE; - st->cur_dts = AV_NOPTS_VALUE; - st->first_dts = AV_NOPTS_VALUE; - - /* default pts settings is MPEG like */ - av_set_pts_info(st, 33, 1, 90000); - st->last_IP_pts = AV_NOPTS_VALUE; - for(i=0; ipts_buffer[i]= AV_NOPTS_VALUE; s->streams[s->nb_streams++] = st; return st; @@ -3112,83 +3053,6 @@ AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, return chapter; } - -/** - * @brief Remove a stream from a media stream. - * - * This is used by mpegts, so we can track streams as indicated by the PMT. - * - * @param s MPEG media stream handle - * @param id stream id of stream to remove - * @param remove_ts if true, remove any matching MPEG-TS filter as well - */ -void av_remove_stream(AVFormatContext *s, int id, int remove_ts) { - int i; - int changes = 0; - - for (i=0; inb_streams; i++) { - if (s->streams[i]->id != id) - continue; - - av_log(NULL, AV_LOG_DEBUG, "av_remove_stream 0x%x\n", id); - - /* close codec context */ - AVCodecContext *codec_ctx = s->streams[i]->codec; - if (codec_ctx->codec) { - avcodec_close(codec_ctx); - av_free(codec_ctx); - } -#if 0 - /* make sure format context is not using the codec context */ - if (&s->streams[i] == s->cur_st) { - av_log(NULL, AV_LOG_DEBUG, "av_remove_stream cur_st = NULL\n"); - s->cur_st = NULL; - } -#endif - /* else if (s->cur_st > &s->streams[i]) { - av_log(NULL, AV_LOG_DEBUG, "av_remove_stream cur_st -= 1\n"); - s->cur_st -= sizeof(AVFormatContext *); - } */ - else { - av_log(NULL, AV_LOG_DEBUG, - "av_remove_stream: no change to cur_st\n"); - } - - av_log(NULL, AV_LOG_DEBUG, "av_remove_stream: removing... " - "s->nb_streams=%d i=%d\n", s->nb_streams, i); - /* actually remove av stream */ - s->nb_streams--; - if ((s->nb_streams - i) > 0) { - memmove(&s->streams[i], &s->streams[i+1], - (s->nb_streams-i)*sizeof(AVFormatContext *)); - } - else - s->streams[i] = NULL; - - /* remove ts filter if remove ts is true and - * the format decoder is the "mpegts" decoder - */ - if (remove_ts && s->iformat && s->priv_data && - (0 == strncmp(s->iformat->name, "mpegts", 6))) { - av_log(NULL, AV_LOG_DEBUG, - "av_remove_stream: mpegts_remove_stream\n"); - MpegTSContext *context = (MpegTSContext*) s->priv_data; - mpegts_remove_stream(context, id); - } - changes = 1; - } - if (changes) - { - // flush queued packets after a stream change (might need to make smarter) - flush_packet_queue(s); - - /* renumber the streams */ - av_log(NULL, AV_LOG_DEBUG, "av_remove_stream: renumbering streams\n"); - for (i=0; inb_streams; i++) - s->streams[i]->index=i; - } -} - /************************************************************/ /* output media file */