Browse Source
* allow to build unpatched ffmpeg using FFMPEG_UNPATCHED variable * TODO: fix deprecated warnings in libstb-hal and neutrino codemaster
vanhofen
7 years ago
13 changed files with 215 additions and 2420 deletions
File diff suppressed because it is too large
@ -1,16 +0,0 @@ |
|||
diff -uNr ffmpeg-3.2.2_orig/libavformat/http.c ffmpeg-3.2.2_chunked_transfer_fix_eof/libavformat/http.c
|
|||
--- ffmpeg-3.2.2_orig/libavformat/http.c 2016-12-06 00:28:58.000000000 +0100
|
|||
+++ ffmpeg-3.2.2_chunked_transfer_fix_eof/libavformat/http.c 2018-01-04 16:39:45.484670390 +0100
|
|||
@@ -1194,8 +1194,11 @@
|
|||
"Chunked encoding data size: %"PRIu64"'\n", |
|||
s->chunksize); |
|||
|
|||
- if (!s->chunksize)
|
|||
+ if (!s->chunksize) {
|
|||
+ /* we need to remember endof*/
|
|||
+ s->chunksize = UINT64_MAX;
|
|||
return 0; |
|||
+ }
|
|||
else if (s->chunksize == UINT64_MAX) { |
|||
av_log(h, AV_LOG_ERROR, "Invalid chunk size %"PRIu64"\n", |
|||
s->chunksize); |
@ -1,16 +0,0 @@ |
|||
Taapat: disable log to fix freezing on edit list parsing intruduced in: |
|||
http://git.videolan.org/gitweb.cgi/ffmpeg.git/?p=ffmpeg.git;a=commitdiff;h=ca6cae73db207f17a0d5507609de12842d8f0ca3 |
|||
|
|||
--- a/libavformat/mov.c 2016-11-14 20:09:13.779085246 +0200
|
|||
+++ b/libavformat/mov.c 2016-11-14 20:09:30.715351822 +0200
|
|||
@@ -3177,8 +3177,10 @@
|
|||
curr_cts = current->timestamp + msc->dts_shift; |
|||
|
|||
if (ctts_data_old && ctts_index_old < ctts_count_old) { |
|||
+ /*
|
|||
av_log(mov->fc, AV_LOG_DEBUG, "shifted frame pts, curr_cts: %"PRId64" @ %"PRId64", ctts: %d, ctts_count: %"PRId64"\n", |
|||
curr_cts, ctts_index_old, ctts_data_old[ctts_index_old].duration, ctts_count_old); |
|||
+ */
|
|||
curr_cts += ctts_data_old[ctts_index_old].duration; |
|||
ctts_sample_old++; |
|||
if (ctts_sample_old == ctts_data_old[ctts_index_old].count) { |
@ -1,18 +0,0 @@ |
|||
Fix VIDEO_GET_PTS error in libeplayer3 intruduced in: |
|||
http://git.videolan.org/gitweb.cgi/ffmpeg.git/?p=ffmpeg.git;a=commitdiff;h=14f7a3d55a43c1082ee1186a1990a431c641052d |
|||
|
|||
--- a/libavformat/mpegts.c
|
|||
+++ b/libavformat/mpegts.c
|
|||
@@ -917,10 +917,10 @@
|
|||
pes->buffer = NULL; |
|||
reset_pes_packet_state(pes); |
|||
|
|||
- sd = av_packet_new_side_data(pkt, AV_PKT_DATA_MPEGTS_STREAM_ID, 1);
|
|||
+ /*sd = av_packet_new_side_data(pkt, AV_PKT_DATA_MPEGTS_STREAM_ID, 1);
|
|||
if (!sd) |
|||
return AVERROR(ENOMEM); |
|||
- *sd = pes->stream_id;
|
|||
+ *sd = pes->stream_id;*/
|
|||
|
|||
return 0; |
|||
} |
@ -1,137 +0,0 @@ |
|||
--- a/libavformat/hls.c
|
|||
+++ b/libavformat/hls.c
|
|||
@@ -204,8 +204,94 @@
|
|||
char *http_proxy; ///< holds the address of the HTTP proxy server |
|||
AVDictionary *avio_opts; |
|||
int strict_std_compliance; |
|||
+ char *key_uri_replace_old;
|
|||
+ char *key_uri_replace_new;
|
|||
} HLSContext; |
|||
|
|||
+/* http://creativeandcritical.net/str-replace-c */
|
|||
+static char *repl_str(const char *str, const char *from, const char *to)
|
|||
+{
|
|||
+ /* Adjust each of the below values to suit your needs. */
|
|||
+
|
|||
+ /* Increment positions cache size initially by this number. */
|
|||
+ size_t cache_sz_inc = 16;
|
|||
+ /* Thereafter, each time capacity needs to be increased,
|
|||
+ * multiply the increment by this factor. */
|
|||
+ const size_t cache_sz_inc_factor = 3;
|
|||
+ /* But never increment capacity by more than this number. */
|
|||
+ const size_t cache_sz_inc_max = 1048576;
|
|||
+
|
|||
+ char *pret, *ret = NULL;
|
|||
+ const char *pstr2, *pstr = str;
|
|||
+ size_t i, count = 0;
|
|||
+#if (__STDC_VERSION__ >= 199901L)
|
|||
+ uintptr_t *pos_cache_tmp, *pos_cache = NULL;
|
|||
+#else
|
|||
+ ptrdiff_t *pos_cache_tmp, *pos_cache = NULL;
|
|||
+#endif
|
|||
+ size_t cache_sz = 0;
|
|||
+ size_t cpylen, orglen, retlen, tolen, fromlen = strlen(from);
|
|||
+
|
|||
+ /* Find all matches and cache their positions. */
|
|||
+ while ((pstr2 = strstr(pstr, from)) != NULL) {
|
|||
+ count++;
|
|||
+
|
|||
+ /* Increase the cache size when necessary. */
|
|||
+ if (cache_sz < count) {
|
|||
+ cache_sz += cache_sz_inc;
|
|||
+ pos_cache_tmp = realloc(pos_cache, sizeof(*pos_cache) * cache_sz);
|
|||
+ if (pos_cache_tmp == NULL) {
|
|||
+ goto end_repl_str;
|
|||
+ } else pos_cache = pos_cache_tmp;
|
|||
+ cache_sz_inc *= cache_sz_inc_factor;
|
|||
+ if (cache_sz_inc > cache_sz_inc_max) {
|
|||
+ cache_sz_inc = cache_sz_inc_max;
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
+ pos_cache[count-1] = pstr2 - str;
|
|||
+ pstr = pstr2 + fromlen;
|
|||
+ }
|
|||
+
|
|||
+ orglen = pstr - str + strlen(pstr);
|
|||
+
|
|||
+ /* Allocate memory for the post-replacement string. */
|
|||
+ if (count > 0) {
|
|||
+ tolen = strlen(to);
|
|||
+ retlen = orglen + (tolen - fromlen) * count;
|
|||
+ } else retlen = orglen;
|
|||
+ ret = malloc(retlen + 1);
|
|||
+ if (ret == NULL) {
|
|||
+ goto end_repl_str;
|
|||
+ }
|
|||
+
|
|||
+ if (count == 0) {
|
|||
+ /* If no matches, then just duplicate the string. */
|
|||
+ strcpy(ret, str);
|
|||
+ } else {
|
|||
+ /* Otherwise, duplicate the string whilst performing
|
|||
+ * the replacements using the position cache. */
|
|||
+ pret = ret;
|
|||
+ memcpy(pret, str, pos_cache[0]);
|
|||
+ pret += pos_cache[0];
|
|||
+ for (i = 0; i < count; i++) {
|
|||
+ memcpy(pret, to, tolen);
|
|||
+ pret += tolen;
|
|||
+ pstr = str + pos_cache[i] + fromlen;
|
|||
+ cpylen = (i == count-1 ? orglen : pos_cache[i+1]) - pos_cache[i] - fromlen;
|
|||
+ memcpy(pret, pstr, cpylen);
|
|||
+ pret += cpylen;
|
|||
+ }
|
|||
+ ret[retlen] = '\0';
|
|||
+ }
|
|||
+
|
|||
+end_repl_str:
|
|||
+ /* Free the cache and return the post-replacement string,
|
|||
+ * which will be NULL in the event of an error. */
|
|||
+ free(pos_cache);
|
|||
+ return ret;
|
|||
+}
|
|||
+
|
|||
static int read_chomp_line(AVIOContext *s, char *buf, int maxlen) |
|||
{ |
|||
int len = ff_get_line(s, buf, maxlen); |
|||
@@ -1106,8 +1192,18 @@
|
|||
AVDictionary *opts2 = NULL; |
|||
char iv[33], key[33], url[MAX_URL_SIZE]; |
|||
if (strcmp(seg->key, pls->key_url)) { |
|||
+ char *key_url = NULL;
|
|||
AVIOContext *pb; |
|||
- if (open_url(pls->parent, &pb, seg->key, c->avio_opts, opts, NULL) == 0) {
|
|||
+
|
|||
+ if (NULL != c->key_uri_replace_old && \
|
|||
+ NULL != c-> key_uri_replace_new && \
|
|||
+ '\0' != c->key_uri_replace_old[0]) {
|
|||
+ key_url = repl_str(seg->key, c->key_uri_replace_old, c->key_uri_replace_new);
|
|||
+ } else {
|
|||
+ key_url = seg->key;
|
|||
+ }
|
|||
+
|
|||
+ if (open_url(pls->parent, &pb, key_url, c->avio_opts, opts, NULL) == 0) {
|
|||
ret = avio_read(pb, pls->key, sizeof(pls->key)); |
|||
if (ret != sizeof(pls->key)) { |
|||
av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n", |
|||
@@ -1119,6 +1215,10 @@
|
|||
seg->key); |
|||
} |
|||
av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url)); |
|||
+
|
|||
+ if (key_url != seg->key) {
|
|||
+ free(key_url);
|
|||
+ }
|
|||
} |
|||
ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0); |
|||
ff_data_to_hex(key, pls->key, sizeof(pls->key), 0); |
|||
@@ -2128,6 +2228,8 @@
|
|||
static const AVOption hls_options[] = { |
|||
{"live_start_index", "segment index to start live streams at (negative values are from the end)", |
|||
OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS}, |
|||
+ { "key_uri_old", "allow to replace part of AES key uri - old", OFFSET(key_uri_replace_old), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, FLAGS },
|
|||
+ { "key_uri_new", "allow to replace part of AES key uri - new", OFFSET(key_uri_replace_new), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, FLAGS },
|
|||
{NULL} |
|||
}; |
|||
|
@ -0,0 +1,16 @@ |
|||
Taapat: disable log to fix freezing on edit list parsing intruduced in: |
|||
http://git.videolan.org/gitweb.cgi/ffmpeg.git/?p=ffmpeg.git;a=commitdiff;h=ca6cae73db207f17a0d5507609de12842d8f0ca3 |
|||
|
|||
--- a/libavformat/mov.c
|
|||
+++ b/libavformat/mov.c
|
|||
@@ -3542,8 +3542,10 @@
|
|||
|
|||
if (ctts_data_old && ctts_index_old < ctts_count_old) { |
|||
curr_ctts = ctts_data_old[ctts_index_old].duration; |
|||
+ /*
|
|||
av_log(mov->fc, AV_LOG_DEBUG, "stts: %"PRId64" ctts: %"PRId64", ctts_index: %"PRId64", ctts_count: %"PRId64"\n", |
|||
curr_cts, curr_ctts, ctts_index_old, ctts_count_old); |
|||
+ */
|
|||
curr_cts += curr_ctts; |
|||
ctts_sample_old++; |
|||
if (ctts_sample_old == ctts_data_old[ctts_index_old].count) { |
@ -1,6 +1,6 @@ |
|||
--- a/libavformat/hls.c
|
|||
+++ b/libavformat/hls.c
|
|||
@@ -1899,8 +1899,10 @@
|
|||
--- a/libavformat/hls.c 2018-08-17 13:06:01.428702126 +0200
|
|||
+++ b/libavformat/hls.c 2018-08-17 13:06:15.077944569 +0200
|
|||
@@ -2079,8 +2079,10 @@
|
|||
HLSContext *c = s->priv_data; |
|||
int ret, i, minplaylist = -1; |
|||
|
@ -0,0 +1,16 @@ |
|||
diff -uNr ffmpeg-3.4.2/libavformat/mpegts.c ffmpeg-3.4.2_fix_mpegts/libavformat/mpegts.c
|
|||
--- ffmpeg-3.4.2/libavformat/mpegts.c 2018-02-12 01:29:06.000000000 +0100
|
|||
+++ ffmpeg-3.4.2_fix_mpegts/libavformat/mpegts.c 2018-02-14 19:36:28.175054407 +0100
|
|||
@@ -930,10 +930,12 @@
|
|||
pes->buffer = NULL; |
|||
reset_pes_packet_state(pes); |
|||
|
|||
+ /*
|
|||
sd = av_packet_new_side_data(pkt, AV_PKT_DATA_MPEGTS_STREAM_ID, 1); |
|||
if (!sd) |
|||
return AVERROR(ENOMEM); |
|||
*sd = pes->stream_id; |
|||
+ */
|
|||
|
|||
return 0; |
|||
} |
@ -0,0 +1,47 @@ |
|||
--- a/libavformat/hls.c 2018-08-17 13:16:57.721007600 +0200
|
|||
+++ b/libavformat/hls.c 2018-08-17 13:33:57.530170057 +0200
|
|||
@@ -213,6 +213,8 @@
|
|||
int max_reload; |
|||
int http_persistent; |
|||
int http_multiple; |
|||
+ char *key_uri_replace_old;
|
|||
+ char *key_uri_replace_new;
|
|||
AVIOContext *playlist_pb; |
|||
} HLSContext; |
|||
|
|||
@@ -1196,8 +1198,16 @@
|
|||
AVDictionary *opts2 = NULL; |
|||
char iv[33], key[33], url[MAX_URL_SIZE]; |
|||
if (strcmp(seg->key, pls->key_url)) { |
|||
+ char *key_url = NULL;
|
|||
AVIOContext *pb = NULL; |
|||
- if (open_url(pls->parent, &pb, seg->key, c->avio_opts, opts, NULL) == 0) {
|
|||
+ if (NULL != c->key_uri_replace_old && \
|
|||
+ NULL != c-> key_uri_replace_new && \
|
|||
+ '\0' != c->key_uri_replace_old[0]) {
|
|||
+ key_url = av_strireplace(seg->key, c->key_uri_replace_old, c->key_uri_replace_new);
|
|||
+ } else {
|
|||
+ key_url = seg->key;
|
|||
+ }
|
|||
+ if (open_url(pls->parent, &pb, key_url, c->avio_opts, opts, NULL) == 0) {
|
|||
ret = avio_read(pb, pls->key, sizeof(pls->key)); |
|||
if (ret != sizeof(pls->key)) { |
|||
av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n", |
|||
@@ -1209,6 +1219,8 @@
|
|||
seg->key); |
|||
} |
|||
av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url)); |
|||
+ if (key_url != seg->key)
|
|||
+ av_free(key_url);
|
|||
} |
|||
ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0); |
|||
ff_data_to_hex(key, pls->key, sizeof(pls->key), 0); |
|||
@@ -2332,6 +2344,8 @@
|
|||
OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS }, |
|||
{"http_multiple", "Use multiple HTTP connections for fetching segments", |
|||
OFFSET(http_multiple), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, FLAGS}, |
|||
+ { "key_uri_old", "allow to replace part of AES key uri - old", OFFSET(key_uri_replace_old), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, FLAGS },
|
|||
+ { "key_uri_new", "allow to replace part of AES key uri - new", OFFSET(key_uri_replace_new), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, FLAGS },
|
|||
{NULL} |
|||
}; |
|||
|
Loading…
Reference in new issue