Skip to content

Commit

Permalink
Move myth libavformat/utils.c mods into libavformat/utils-myth.c
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jyavenard committed May 23, 2012
1 parent 5243960 commit 3d1260b
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 144 deletions.
1 change: 1 addition & 0 deletions mythtv/external/FFmpeg/libavformat/Makefile
Expand Up @@ -18,6 +18,7 @@ OBJS = allformats.o \
sdp.o \
seek.o \
utils.o \
utils-myth.o \

OBJS-$(CONFIG_NETWORK) += network.o

Expand Down
16 changes: 11 additions & 5 deletions mythtv/external/FFmpeg/libavformat/avformat.h
Expand Up @@ -1102,7 +1102,6 @@ typedef struct AVPacketList {
struct AVPacketList *next;
} AVPacketList;

#define MAX_STREAMS 100

/**
* @defgroup lavf_core Core functions
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */

/**
* @}
*/
Expand Down
160 changes: 160 additions & 0 deletions 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; i<MAX_REORDER_DELAY+1; i++)
st->pts_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; i<s->nb_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; i<s->nb_streams; i++)
s->streams[i]->index=i;
}
}

void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
{
return estimate_timings(ic, old_offset);
}

0 comments on commit 3d1260b

Please sign in to comment.