mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-08-03 16:07:51 +00:00
ffmpeg: add more xbmc patches
This commit is contained in:
parent
d21cafecef
commit
bc1526aba8
@ -0,0 +1,29 @@
|
||||
From f65afef1df49f53e14c8d4173ff960fff8d44ecb Mon Sep 17 00:00:00 2001
|
||||
From: Rainer Hochecker <fernetmenta@online.de>
|
||||
Date: Tue, 3 Dec 2013 10:03:04 +0100
|
||||
Subject: [PATCH] mpegts: do not set pts for missing dts in video streams
|
||||
|
||||
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
|
||||
---
|
||||
libavformat/mpegts.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
|
||||
index 59b0058..d67c63a 100644
|
||||
--- a/libavformat/mpegts.c
|
||||
+++ b/libavformat/mpegts.c
|
||||
@@ -972,7 +972,10 @@ static int mpegts_push_data(MpegTSFilter *filter,
|
||||
pes->pts = AV_NOPTS_VALUE;
|
||||
pes->dts = AV_NOPTS_VALUE;
|
||||
if ((flags & 0xc0) == 0x80) {
|
||||
- pes->dts = pes->pts = ff_parse_pes_pts(r);
|
||||
+ pes->pts = ff_parse_pes_pts(r);
|
||||
+ /* video pts is not monotonic, can't be used for dts */
|
||||
+ if (pes->st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
|
||||
+ pes->dts = pes->pts;
|
||||
r += 5;
|
||||
} else if ((flags & 0xc0) == 0xc0) {
|
||||
pes->pts = ff_parse_pes_pts(r);
|
||||
--
|
||||
1.8.5-rc3
|
||||
|
@ -0,0 +1,135 @@
|
||||
From 120e44f817d73572d14a3db4af24a3d517aaacd8 Mon Sep 17 00:00:00 2001
|
||||
From: Joakim Plate <elupus@ecce.se>
|
||||
Date: Sat, 14 Dec 2013 14:55:13 +0100
|
||||
Subject: [PATCH 1/1] mpegts: stop analyzing when pmt for all programs have
|
||||
been found
|
||||
|
||||
This disables NOHEADER after finding PMT for all programs to
|
||||
avoid find_stream_info always exhausting probe size for mpegts.
|
||||
|
||||
This is very important for live streams since read speed
|
||||
will be limited. rtsp, udp and any protocol streaming a live
|
||||
mpegts will have dramatically faster startup time.
|
||||
|
||||
Note, lack of codec parameters for streams can still cause
|
||||
the full probe size to be exhausted.
|
||||
---
|
||||
libavformat/mpegts.c | 54 +++++++++++++++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 45 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
|
||||
index d67c63a..fa92fb7 100644
|
||||
--- a/libavformat/mpegts.c
|
||||
+++ b/libavformat/mpegts.c
|
||||
@@ -90,6 +90,9 @@ struct Program {
|
||||
unsigned int id; //program id/service id
|
||||
unsigned int nb_pids;
|
||||
unsigned int pids[MAX_PIDS_PER_PROGRAM];
|
||||
+
|
||||
+ /** have we found pmt for this program */
|
||||
+ int pmt_found;
|
||||
};
|
||||
|
||||
struct MpegTSContext {
|
||||
@@ -205,6 +208,17 @@ typedef struct PESContext {
|
||||
|
||||
extern AVInputFormat ff_mpegts_demuxer;
|
||||
|
||||
+static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
|
||||
+{
|
||||
+ int i;
|
||||
+ for(i=0; i<ts->nb_prg; i++) {
|
||||
+ if(ts->prg[i].id == programid) {
|
||||
+ return &ts->prg[i];
|
||||
+ }
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
|
||||
{
|
||||
AVProgram *prg = NULL;
|
||||
@@ -225,8 +239,10 @@ static void clear_program(MpegTSContext *ts, unsigned int programid)
|
||||
|
||||
clear_avprogram(ts, programid);
|
||||
for(i=0; i<ts->nb_prg; i++)
|
||||
- if(ts->prg[i].id == programid)
|
||||
+ if(ts->prg[i].id == programid) {
|
||||
ts->prg[i].nb_pids = 0;
|
||||
+ ts->prg[i].pmt_found = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void clear_programs(MpegTSContext *ts)
|
||||
@@ -245,19 +261,13 @@ static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
|
||||
p = &ts->prg[ts->nb_prg];
|
||||
p->id = programid;
|
||||
p->nb_pids = 0;
|
||||
+ p->pmt_found = 0;
|
||||
ts->nb_prg++;
|
||||
}
|
||||
|
||||
static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
|
||||
{
|
||||
- int i;
|
||||
- struct Program *p = NULL;
|
||||
- for(i=0; i<ts->nb_prg; i++) {
|
||||
- if(ts->prg[i].id == programid) {
|
||||
- p = &ts->prg[i];
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
+ struct Program *p = get_program(ts, programid);
|
||||
if(!p)
|
||||
return;
|
||||
|
||||
@@ -266,6 +276,15 @@ static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned i
|
||||
p->pids[p->nb_pids++] = pid;
|
||||
}
|
||||
|
||||
+static void set_pmt_found(MpegTSContext *ts, unsigned int programid)
|
||||
+{
|
||||
+ struct Program *p = get_program(ts, programid);
|
||||
+ if(!p)
|
||||
+ return;
|
||||
+
|
||||
+ p->pmt_found = 1;
|
||||
+}
|
||||
+
|
||||
static void set_pcr_pid(AVFormatContext *s, unsigned int programid, unsigned int pid)
|
||||
{
|
||||
int i;
|
||||
@@ -1590,6 +1609,8 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
|
||||
if (!ts->stream->nb_streams)
|
||||
ts->stop_parse = 2;
|
||||
|
||||
+ set_pmt_found(ts, h->id);
|
||||
+
|
||||
for(;;) {
|
||||
st = 0;
|
||||
pes = NULL;
|
||||
@@ -1912,6 +1933,21 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
|
||||
p, p_end - p, 0);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ // stop find_stream_info from waiting for more streams
|
||||
+ // when all programs have received a PMT
|
||||
+ if( ts->stream->ctx_flags & AVFMTCTX_NOHEADER) {
|
||||
+ int i;
|
||||
+ for(i=0; i<ts->nb_prg; i++) {
|
||||
+ if (!ts->prg[i].pmt_found)
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i == ts->nb_prg && ts->nb_prg > 0) {
|
||||
+ av_log(ts->stream, AV_LOG_DEBUG, "All programs have pmt, headers found\n");
|
||||
+ ts->stream->ctx_flags &= ~AVFMTCTX_NOHEADER;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
} else {
|
||||
int ret;
|
||||
int64_t pcr = -1;
|
||||
--
|
||||
1.8.2
|
||||
|
Loading…
x
Reference in New Issue
Block a user