summaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-04-24 03:38:03 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-04-24 03:41:22 +0200
commit7b376b398a464a5825ede8b10d5f605c526c7399 (patch)
treee254c50f44e8befc83e4dde353ff3cd6189f2061 /libavformat
parentc225615bf2da206775c5ff2b56d648cf50d38756 (diff)
parentb1ac139d89b9fc55b70ad3411af2f75fe8b17805 (diff)
downloadffmpeg-streaming-7b376b398a464a5825ede8b10d5f605c526c7399.zip
ffmpeg-streaming-7b376b398a464a5825ede8b10d5f605c526c7399.tar.gz
Merge remote branch 'qatar/master'
* qatar/master: Handle unicode file names on windows rtp: Rename the open/close functions to alloc/free Lowercase all ff* program names. Refer to ff* tools by their lowercase names. NOT Pulled Replace more FFmpeg instances by Libav or ffmpeg. Replace `` by $() syntax in shell scripts. patcheck: Allow overiding grep program(s) through environment variables. NOT Pulled Remove stray libavcore and _g binary references. vorbis: Rename decoder/encoder files to follow general file naming scheme. aacenc: Fix whitespace after last commit. cook: Fix small typo in av_log_ask_for_sample message. aacenc: Finish 3GPP psymodel analysis for non mid/side cases. Remove RDFT dependency from AAC decoder. Add some debug log messages to AAC extradata Fix mov debug (u)int64_t format strings. bswap: use native types for av_bwap16(). doc: FLV muxing is supported. applehttp: Handle AES-128 encrypted streams Add a protocol handler for AES CBC decryption with PKCS7 padding doc: Mention that DragonFly BSD requires __BSD_VISIBLE set Conflicts: ffplay.c ffprobe.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/Makefile1
-rw-r--r--libavformat/allformats.c1
-rw-r--r--libavformat/applehttp.c108
-rw-r--r--libavformat/crypto.c170
-rw-r--r--libavformat/mov.c6
-rw-r--r--libavformat/os_support.c28
-rw-r--r--libavformat/os_support.h5
-rw-r--r--libavformat/rdt.c4
-rw-r--r--libavformat/rtpdec.h4
-rw-r--r--libavformat/rtpdec_amr.c8
-rw-r--r--libavformat/rtpdec_asf.c4
-rw-r--r--libavformat/rtpdec_h264.c4
-rw-r--r--libavformat/rtpdec_latm.c4
-rw-r--r--libavformat/rtpdec_mpeg4.c8
-rw-r--r--libavformat/rtpdec_qcelp.c4
-rw-r--r--libavformat/rtpdec_qdm2.c4
-rw-r--r--libavformat/rtpdec_qt.c4
-rw-r--r--libavformat/rtpdec_svq3.c4
-rw-r--r--libavformat/rtpdec_vp8.c4
-rw-r--r--libavformat/rtpdec_xiph.c8
-rw-r--r--libavformat/rtsp.c6
-rw-r--r--libavformat/version.h2
22 files changed, 349 insertions, 42 deletions
diff --git a/libavformat/Makefile b/libavformat/Makefile
index f83642f..83f92e1 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -316,6 +316,7 @@ OBJS+= avio.o aviobuf.o
OBJS-$(CONFIG_APPLEHTTP_PROTOCOL) += applehttpproto.o
OBJS-$(CONFIG_CONCAT_PROTOCOL) += concat.o
+OBJS-$(CONFIG_CRYPTO_PROTOCOL) += crypto.o
OBJS-$(CONFIG_FILE_PROTOCOL) += file.o
OBJS-$(CONFIG_GOPHER_PROTOCOL) += gopher.o
OBJS-$(CONFIG_HTTP_PROTOCOL) += http.o httpauth.o
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index 4f28ab7..d08f2f7 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -237,6 +237,7 @@ void av_register_all(void)
/* protocols */
REGISTER_PROTOCOL (APPLEHTTP, applehttp);
REGISTER_PROTOCOL (CONCAT, concat);
+ REGISTER_PROTOCOL (CRYPTO, crypto);
REGISTER_PROTOCOL (FILE, file);
REGISTER_PROTOCOL (GOPHER, gopher);
REGISTER_PROTOCOL (HTTP, http);
diff --git a/libavformat/applehttp.c b/libavformat/applehttp.c
index 27d9858..93d4f73 100644
--- a/libavformat/applehttp.c
+++ b/libavformat/applehttp.c
@@ -27,6 +27,8 @@
#define _XOPEN_SOURCE 600
#include "libavutil/avstring.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
#include "avformat.h"
#include "internal.h"
#include <unistd.h>
@@ -47,9 +49,17 @@
* one anonymous toplevel variant for this, to maintain the structure.
*/
+enum KeyType {
+ KEY_NONE,
+ KEY_AES_128,
+};
+
struct segment {
int duration;
char url[MAX_URL_SIZE];
+ char key[MAX_URL_SIZE];
+ enum KeyType key_type;
+ uint8_t iv[16];
};
/*
@@ -77,6 +87,9 @@ struct variant {
int needed, cur_needed;
int cur_seq_no;
int64_t last_load_time;
+
+ char key_url[MAX_URL_SIZE];
+ uint8_t key[16];
};
typedef struct AppleHTTPContext {
@@ -160,10 +173,35 @@ static void handle_variant_args(struct variant_info *info, const char *key,
}
}
+struct key_info {
+ char uri[MAX_URL_SIZE];
+ char method[10];
+ char iv[35];
+};
+
+static void handle_key_args(struct key_info *info, const char *key,
+ int key_len, char **dest, int *dest_len)
+{
+ if (!strncmp(key, "METHOD=", key_len)) {
+ *dest = info->method;
+ *dest_len = sizeof(info->method);
+ } else if (!strncmp(key, "URI=", key_len)) {
+ *dest = info->uri;
+ *dest_len = sizeof(info->uri);
+ } else if (!strncmp(key, "IV=", key_len)) {
+ *dest = info->iv;
+ *dest_len = sizeof(info->iv);
+ }
+}
+
static int parse_playlist(AppleHTTPContext *c, const char *url,
struct variant *var, AVIOContext *in)
{
int ret = 0, duration = 0, is_segment = 0, is_variant = 0, bandwidth = 0;
+ enum KeyType key_type = KEY_NONE;
+ uint8_t iv[16] = "";
+ int has_iv = 0;
+ char key[MAX_URL_SIZE];
char line[1024];
const char *ptr;
int close_in = 0;
@@ -192,6 +230,19 @@ static int parse_playlist(AppleHTTPContext *c, const char *url,
ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_variant_args,
&info);
bandwidth = atoi(info.bandwidth);
+ } else if (av_strstart(line, "#EXT-X-KEY:", &ptr)) {
+ struct key_info info = {{0}};
+ ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_key_args,
+ &info);
+ key_type = KEY_NONE;
+ has_iv = 0;
+ if (!strcmp(info.method, "AES-128"))
+ key_type = KEY_AES_128;
+ if (!strncmp(info.iv, "0x", 2) || !strncmp(info.iv, "0X", 2)) {
+ ff_hex_to_data(iv, info.iv + 2);
+ has_iv = 1;
+ }
+ av_strlcpy(key, info.uri, sizeof(key));
} else if (av_strstart(line, "#EXT-X-TARGETDURATION:", &ptr)) {
if (!var) {
var = new_variant(c, 0, url, NULL);
@@ -242,6 +293,15 @@ static int parse_playlist(AppleHTTPContext *c, const char *url,
goto fail;
}
seg->duration = duration;
+ seg->key_type = key_type;
+ if (has_iv) {
+ memcpy(seg->iv, iv, sizeof(iv));
+ } else {
+ int seq = var->start_seq_no + var->n_segments;
+ memset(seg->iv, 0, sizeof(seg->iv));
+ AV_WB32(seg->iv + 12, seq);
+ }
+ ff_make_absolute_url(seg->key, sizeof(seg->key), url, key);
ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
dynarray_add(&var->segments, &var->n_segments, seg);
is_segment = 0;
@@ -257,6 +317,50 @@ fail:
return ret;
}
+static int open_input(struct variant *var)
+{
+ struct segment *seg = var->segments[var->cur_seq_no - var->start_seq_no];
+ if (seg->key_type == KEY_NONE) {
+ return ffurl_open(&var->input, seg->url, AVIO_FLAG_READ);
+ } else if (seg->key_type == KEY_AES_128) {
+ char iv[33], key[33], url[MAX_URL_SIZE];
+ int ret;
+ if (strcmp(seg->key, var->key_url)) {
+ URLContext *uc;
+ if (ffurl_open(&uc, seg->key, AVIO_FLAG_READ) == 0) {
+ if (ffurl_read_complete(uc, var->key, sizeof(var->key))
+ != sizeof(var->key)) {
+ av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n",
+ seg->key);
+ }
+ ffurl_close(uc);
+ } else {
+ av_log(NULL, AV_LOG_ERROR, "Unable to open key file %s\n",
+ seg->key);
+ }
+ av_strlcpy(var->key_url, seg->key, sizeof(var->key_url));
+ }
+ ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0);
+ ff_data_to_hex(key, var->key, sizeof(var->key), 0);
+ iv[32] = key[32] = '\0';
+ if (strstr(seg->url, "://"))
+ snprintf(url, sizeof(url), "crypto+%s", seg->url);
+ else
+ snprintf(url, sizeof(url), "crypto:%s", seg->url);
+ if ((ret = ffurl_alloc(&var->input, url, AVIO_FLAG_READ)) < 0)
+ return ret;
+ av_set_string3(var->input->priv_data, "key", key, 0, NULL);
+ av_set_string3(var->input->priv_data, "iv", iv, 0, NULL);
+ if ((ret = ffurl_connect(var->input)) < 0) {
+ ffurl_close(var->input);
+ var->input = NULL;
+ return ret;
+ }
+ return 0;
+ }
+ return AVERROR(ENOSYS);
+}
+
static int read_data(void *opaque, uint8_t *buf, int buf_size)
{
struct variant *v = opaque;
@@ -291,9 +395,7 @@ reload:
goto reload;
}
- ret = ffurl_open(&v->input,
- v->segments[v->cur_seq_no - v->start_seq_no]->url,
- AVIO_FLAG_READ);
+ ret = open_input(v);
if (ret < 0)
return ret;
}
diff --git a/libavformat/crypto.c b/libavformat/crypto.c
new file mode 100644
index 0000000..ea6012a
--- /dev/null
+++ b/libavformat/crypto.c
@@ -0,0 +1,170 @@
+/*
+ * Decryption protocol handler
+ * Copyright (c) 2011 Martin Storsjo
+ *
+ * This file is part of Libav.
+ *
+ * Libav 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.
+ *
+ * Libav 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 Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avformat.h"
+#include "libavutil/aes.h"
+#include "libavutil/avstring.h"
+#include "libavutil/opt.h"
+#include "internal.h"
+#include "url.h"
+
+#define MAX_BUFFER_BLOCKS 150
+#define BLOCKSIZE 16
+
+typedef struct {
+ const AVClass *class;
+ URLContext *hd;
+ uint8_t inbuffer [BLOCKSIZE*MAX_BUFFER_BLOCKS],
+ outbuffer[BLOCKSIZE*MAX_BUFFER_BLOCKS];
+ uint8_t *outptr;
+ int indata, indata_used, outdata;
+ int eof;
+ uint8_t *key;
+ int keylen;
+ uint8_t *iv;
+ int ivlen;
+ struct AVAES *aes;
+} CryptoContext;
+
+#define OFFSET(x) offsetof(CryptoContext, x)
+static const AVOption options[] = {
+ {"key", "AES decryption key", OFFSET(key), FF_OPT_TYPE_BINARY },
+ {"iv", "AES decryption initialization vector", OFFSET(iv), FF_OPT_TYPE_BINARY },
+ { NULL }
+};
+
+static const AVClass crypto_class = {
+ "crypto", av_default_item_name, options, LIBAVUTIL_VERSION_INT
+};
+
+static int crypto_open(URLContext *h, const char *uri, int flags)
+{
+ const char *nested_url;
+ int ret;
+ CryptoContext *c = h->priv_data;
+
+ if (!av_strstart(uri, "crypto+", &nested_url) &&
+ !av_strstart(uri, "crypto:", &nested_url)) {
+ av_log(h, AV_LOG_ERROR, "Unsupported url %s\n", uri);
+ ret = AVERROR(EINVAL);
+ goto err;
+ }
+
+ if (c->keylen < BLOCKSIZE || c->ivlen < BLOCKSIZE) {
+ av_log(h, AV_LOG_ERROR, "Key or IV not set\n");
+ ret = AVERROR(EINVAL);
+ goto err;
+ }
+ if (flags & AVIO_FLAG_WRITE) {
+ av_log(h, AV_LOG_ERROR, "Only decryption is supported currently\n");
+ ret = AVERROR(ENOSYS);
+ goto err;
+ }
+ if ((ret = ffurl_open(&c->hd, nested_url, AVIO_FLAG_READ)) < 0) {
+ av_log(h, AV_LOG_ERROR, "Unable to open input\n");
+ goto err;
+ }
+ c->aes = av_mallocz(av_aes_size);
+ if (!c->aes) {
+ ret = AVERROR(ENOMEM);
+ goto err;
+ }
+
+ av_aes_init(c->aes, c->key, 128, 1);
+
+ h->is_streamed = 1;
+
+ return 0;
+err:
+ av_free(c->key);
+ av_free(c->iv);
+ return ret;
+}
+
+static int crypto_read(URLContext *h, uint8_t *buf, int size)
+{
+ CryptoContext *c = h->priv_data;
+ int blocks;
+retry:
+ if (c->outdata > 0) {
+ size = FFMIN(size, c->outdata);
+ memcpy(buf, c->outptr, size);
+ c->outptr += size;
+ c->outdata -= size;
+ return size;
+ }
+ // We avoid using the last block until we've found EOF,
+ // since we'll remove PKCS7 padding at the end. So make
+ // sure we've got at least 2 blocks, so we can decrypt
+ // at least one.
+ while (c->indata - c->indata_used < 2*BLOCKSIZE) {
+ int n = ffurl_read(c->hd, c->inbuffer + c->indata,
+ sizeof(c->inbuffer) - c->indata);
+ if (n <= 0) {
+ c->eof = 1;
+ break;
+ }
+ c->indata += n;
+ }
+ blocks = (c->indata - c->indata_used) / BLOCKSIZE;
+ if (!blocks)
+ return AVERROR_EOF;
+ if (!c->eof)
+ blocks--;
+ av_aes_crypt(c->aes, c->outbuffer, c->inbuffer + c->indata_used, blocks,
+ c->iv, 1);
+ c->outdata = BLOCKSIZE * blocks;
+ c->outptr = c->outbuffer;
+ c->indata_used += BLOCKSIZE * blocks;
+ if (c->indata_used >= sizeof(c->inbuffer)/2) {
+ memmove(c->inbuffer, c->inbuffer + c->indata_used,
+ c->indata - c->indata_used);
+ c->indata -= c->indata_used;
+ c->indata_used = 0;
+ }
+ if (c->eof) {
+ // Remove PKCS7 padding at the end
+ int padding = c->outbuffer[c->outdata - 1];
+ c->outdata -= padding;
+ }
+ goto retry;
+}
+
+static int crypto_close(URLContext *h)
+{
+ CryptoContext *c = h->priv_data;
+ if (c->hd)
+ ffurl_close(c->hd);
+ av_free(c->aes);
+ av_free(c->key);
+ av_free(c->iv);
+ return 0;
+}
+
+URLProtocol ff_crypto_protocol = {
+ .name = "crypto",
+ .url_open = crypto_open,
+ .url_read = crypto_read,
+ .url_close = crypto_close,
+ .priv_data_size = sizeof(CryptoContext),
+ .priv_data_class = &crypto_class,
+ .flags = URL_PROTOCOL_FLAG_NESTED_SCHEME,
+};
diff --git a/libavformat/mov.c b/libavformat/mov.c
index ee033ea..a44182a 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -588,7 +588,7 @@ static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
c->fragment.moof_offset = avio_tell(pb) - 8;
- av_dlog(c->fc, "moof offset %llx\n", c->fragment.moof_offset);
+ av_dlog(c->fc, "moof offset %"PRIx64"\n", c->fragment.moof_offset);
return mov_read_default(c, pb, atom);
}
@@ -2367,7 +2367,7 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
av_log(s, AV_LOG_ERROR, "moov atom not found\n");
return -1;
}
- av_dlog(mov->fc, "on_parse_exit_offset=%lld\n", avio_tell(pb));
+ av_dlog(mov->fc, "on_parse_exit_offset=%"PRId64"\n", avio_tell(pb));
if (pb->seekable && mov->chapter_track > 0)
mov_read_chapters(s);
@@ -2416,7 +2416,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 ||
url_feof(s->pb))
return AVERROR_EOF;
- av_dlog(s, "read fragments, offset 0x%llx\n", avio_tell(s->pb));
+ av_dlog(s, "read fragments, offset 0x%"PRIx64"\n", avio_tell(s->pb));
goto retry;
}
sc = st->priv_data;
diff --git a/libavformat/os_support.c b/libavformat/os_support.c
index 0b7b59e..8afa628 100644
--- a/libavformat/os_support.c
+++ b/libavformat/os_support.c
@@ -28,6 +28,34 @@
#include "avformat.h"
#include "os_support.h"
+#if defined(_WIN32) && !defined(__MINGW32CE__)
+#include <windows.h>
+
+#undef open
+int ff_win32_open(const char *filename_utf8, int oflag, int pmode)
+{
+ int fd;
+ int num_chars;
+ wchar_t *filename_w;
+
+ /* convert UTF-8 to wide chars */
+ num_chars = MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, NULL, 0);
+ if (num_chars <= 0)
+ return -1;
+ filename_w = av_mallocz(sizeof(wchar_t) * num_chars);
+ MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, filename_w, num_chars);
+
+ fd = _wopen(filename_w, oflag, pmode);
+ av_freep(&filename_w);
+
+ /* filename maybe be in CP_ACP */
+ if (fd == -1 && !(oflag & O_CREAT))
+ return open(filename_utf8, oflag, pmode);
+
+ return fd;
+}
+#endif
+
#if CONFIG_NETWORK
#include <fcntl.h>
#include <unistd.h>
diff --git a/libavformat/os_support.h b/libavformat/os_support.h
index df32151..f770528 100644
--- a/libavformat/os_support.h
+++ b/libavformat/os_support.h
@@ -45,6 +45,11 @@ static inline int is_dos_path(const char *path)
return 0;
}
+#if defined(_WIN32) && !defined(__MINGW32CE__)
+int ff_win32_open(const char *filename, int oflag, int pmode);
+#define open ff_win32_open
+#endif
+
#if CONFIG_NETWORK
#if !HAVE_SOCKLEN_T
typedef int socklen_t;
diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index d6a96de..5c35b74 100644
--- a/libavformat/rdt.c
+++ b/libavformat/rdt.c
@@ -551,8 +551,8 @@ static RTPDynamicProtocolHandler ff_rdt_ ## n ## _handler = { \
.codec_type = t, \
.codec_id = CODEC_ID_NONE, \
.parse_sdp_a_line = rdt_parse_sdp_line, \
- .open = rdt_new_context, \
- .close = rdt_free_context, \
+ .alloc = rdt_new_context, \
+ .free = rdt_free_context, \
.parse_packet = rdt_parse_packet \
}
diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h
index 8148a7d..2801101 100644
--- a/libavformat/rtpdec.h
+++ b/libavformat/rtpdec.h
@@ -126,8 +126,8 @@ struct RTPDynamicProtocolHandler_s {
int st_index,
PayloadContext *priv_data,
const char *line); ///< Parse the a= line from the sdp field
- PayloadContext *(*open) (void); ///< allocate any data needed by the rtp parsing for this dynamic data.
- void (*close)(PayloadContext *protocol_data); ///< free any data needed by the rtp parsing for this dynamic data.
+ PayloadContext *(*alloc) (void); ///< allocate any data needed by the rtp parsing for this dynamic data.
+ void (*free)(PayloadContext *protocol_data); ///< free any data needed by the rtp parsing for this dynamic data.
DynamicPayloadPacketHandlerProc parse_packet; ///< parse handler for this dynamic packet.
struct RTPDynamicProtocolHandler_s *next;
diff --git a/libavformat/rtpdec_amr.c b/libavformat/rtpdec_amr.c
index 016d216..fbf4321 100644
--- a/libavformat/rtpdec_amr.c
+++ b/libavformat/rtpdec_amr.c
@@ -191,8 +191,8 @@ RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_AMR_NB,
.parse_sdp_a_line = amr_parse_sdp_line,
- .open = amr_new_context,
- .close = amr_free_context,
+ .alloc = amr_new_context,
+ .free = amr_free_context,
.parse_packet = amr_handle_packet,
};
@@ -201,8 +201,8 @@ RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_AMR_WB,
.parse_sdp_a_line = amr_parse_sdp_line,
- .open = amr_new_context,
- .close = amr_free_context,
+ .alloc = amr_new_context,
+ .free = amr_free_context,
.parse_packet = amr_handle_packet,
};
diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c
index 61bf87d..b2ac2b7 100644
--- a/libavformat/rtpdec_asf.c
+++ b/libavformat/rtpdec_asf.c
@@ -286,8 +286,8 @@ RTPDynamicProtocolHandler ff_ms_rtp_ ## n ## _handler = { \
.codec_type = t, \
.codec_id = CODEC_ID_NONE, \
.parse_sdp_a_line = asfrtp_parse_sdp_line, \
- .open = asfrtp_new_context, \
- .close = asfrtp_free_context, \
+ .alloc = asfrtp_new_context, \
+ .free = asfrtp_free_context, \
.parse_packet = asfrtp_parse_packet, \
}
diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c
index 75db14c..730ed14 100644
--- a/libavformat/rtpdec_h264.c
+++ b/libavformat/rtpdec_h264.c
@@ -398,7 +398,7 @@ RTPDynamicProtocolHandler ff_h264_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_VIDEO,
.codec_id = CODEC_ID_H264,
.parse_sdp_a_line = parse_h264_sdp_line,
- .open = h264_new_context,
- .close = h264_free_context,
+ .alloc = h264_new_context,
+ .free = h264_free_context,
.parse_packet = h264_handle_packet
};
diff --git a/libavformat/rtpdec_latm.c b/libavformat/rtpdec_latm.c
index 6ff9fd9..2b366a0 100644
--- a/libavformat/rtpdec_latm.c
+++ b/libavformat/rtpdec_latm.c
@@ -181,7 +181,7 @@ RTPDynamicProtocolHandler ff_mp4a_latm_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_AAC,
.parse_sdp_a_line = latm_parse_sdp_line,
- .open = latm_new_context,
- .close = latm_free_context,
+ .alloc = latm_new_context,
+ .free = latm_free_context,
.parse_packet = latm_parse_packet
};
diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c
index 5498d1c..07f07ae 100644
--- a/libavformat/rtpdec_mpeg4.c
+++ b/libavformat/rtpdec_mpeg4.c
@@ -235,8 +235,8 @@ RTPDynamicProtocolHandler ff_mp4v_es_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_VIDEO,
.codec_id = CODEC_ID_MPEG4,
.parse_sdp_a_line = parse_sdp_line,
- .open = NULL,
- .close = NULL,
+ .alloc = NULL,
+ .free = NULL,
.parse_packet = NULL
};
@@ -245,7 +245,7 @@ RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_AAC,
.parse_sdp_a_line = parse_sdp_line,
- .open = new_context,
- .close = free_context,
+ .alloc = new_context,
+ .free = free_context,
.parse_packet = aac_parse_packet
};
diff --git a/libavformat/rtpdec_qcelp.c b/libavformat/rtpdec_qcelp.c
index ceae504..5eb6770 100644
--- a/libavformat/rtpdec_qcelp.c
+++ b/libavformat/rtpdec_qcelp.c
@@ -223,7 +223,7 @@ RTPDynamicProtocolHandler ff_qcelp_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_QCELP,
.static_payload_id = 12,
- .open = qcelp_new_context,
- .close = qcelp_free_context,
+ .alloc = qcelp_new_context,
+ .free = qcelp_free_context,
.parse_packet = qcelp_parse_packet
};
diff --git a/libavformat/rtpdec_qdm2.c b/libavformat/rtpdec_qdm2.c
index aa94b1f..1c1d321 100644
--- a/libavformat/rtpdec_qdm2.c
+++ b/libavformat/rtpdec_qdm2.c
@@ -309,7 +309,7 @@ RTPDynamicProtocolHandler ff_qdm2_dynamic_handler = {
.enc_name = "X-QDM",
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_NONE,
- .open = qdm2_extradata_new,
- .close = qdm2_extradata_free,
+ .alloc = qdm2_extradata_new,
+ .free = qdm2_extradata_free,
.parse_packet = qdm2_parse_packet,
};
diff --git a/libavformat/rtpdec_qt.c b/libavformat/rtpdec_qt.c
index 7df11b3..fd63aa7 100644
--- a/libavformat/rtpdec_qt.c
+++ b/libavformat/rtpdec_qt.c
@@ -244,8 +244,8 @@ RTPDynamicProtocolHandler ff_ ## m ## _rtp_ ## n ## _handler = { \
.enc_name = s, \
.codec_type = t, \
.codec_id = CODEC_ID_NONE, \
- .open = qt_rtp_new, \
- .close = qt_rtp_free, \
+ .alloc = qt_rtp_new, \
+ .free = qt_rtp_free, \
.parse_packet = qt_rtp_parse_packet, \
}
diff --git a/libavformat/rtpdec_svq3.c b/libavformat/rtpdec_svq3.c
index b3559ae..cb5f74d 100644
--- a/libavformat/rtpdec_svq3.c
+++ b/libavformat/rtpdec_svq3.c
@@ -128,7 +128,7 @@ RTPDynamicProtocolHandler ff_svq3_dynamic_handler = {
.enc_name = "X-SV3V-ES",
.codec_type = AVMEDIA_TYPE_VIDEO,
.codec_id = CODEC_ID_NONE, // see if (config_packet) above
- .open = svq3_extradata_new,
- .close = svq3_extradata_free,
+ .alloc = svq3_extradata_new,
+ .free = svq3_extradata_free,
.parse_packet = svq3_parse_packet,
};
diff --git a/libavformat/rtpdec_vp8.c b/libavformat/rtpdec_vp8.c
index e657ca2..862a55e 100644
--- a/libavformat/rtpdec_vp8.c
+++ b/libavformat/rtpdec_vp8.c
@@ -148,7 +148,7 @@ RTPDynamicProtocolHandler ff_vp8_dynamic_handler = {
.enc_name = "VP8",
.codec_type = AVMEDIA_TYPE_VIDEO,
.codec_id = CODEC_ID_VP8,
- .open = vp8_new_context,
- .close = vp8_free_context,
+ .alloc = vp8_new_context,
+ .free = vp8_free_context,
.parse_packet = vp8_handle_packet,
};
diff --git a/libavformat/rtpdec_xiph.c b/libavformat/rtpdec_xiph.c
index 5a9abdb..6aeea2f 100644
--- a/libavformat/rtpdec_xiph.c
+++ b/libavformat/rtpdec_xiph.c
@@ -389,8 +389,8 @@ RTPDynamicProtocolHandler ff_theora_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_VIDEO,
.codec_id = CODEC_ID_THEORA,
.parse_sdp_a_line = xiph_parse_sdp_line,
- .open = xiph_new_context,
- .close = xiph_free_context,
+ .alloc = xiph_new_context,
+ .free = xiph_free_context,
.parse_packet = xiph_handle_packet
};
@@ -399,7 +399,7 @@ RTPDynamicProtocolHandler ff_vorbis_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_VORBIS,
.parse_sdp_a_line = xiph_parse_sdp_line,
- .open = xiph_new_context,
- .close = xiph_free_context,
+ .alloc = xiph_new_context,
+ .free = xiph_free_context,
.parse_packet = xiph_handle_packet
};
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 7ea5594..b6ed0c6 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -132,8 +132,8 @@ static void init_rtp_handler(RTPDynamicProtocolHandler *handler,
return;
codec->codec_id = handler->codec_id;
rtsp_st->dynamic_handler = handler;
- if (handler->open)
- rtsp_st->dynamic_protocol_context = handler->open();
+ if (handler->alloc)
+ rtsp_st->dynamic_protocol_context = handler->alloc();
}
/* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */
@@ -526,7 +526,7 @@ void ff_rtsp_close_streams(AVFormatContext *s)
rtsp_st = rt->rtsp_streams[i];
if (rtsp_st) {
if (rtsp_st->dynamic_handler && rtsp_st->dynamic_protocol_context)
- rtsp_st->dynamic_handler->close(
+ rtsp_st->dynamic_handler->free(
rtsp_st->dynamic_protocol_context);
av_free(rtsp_st);
}
diff --git a/libavformat/version.h b/libavformat/version.h
index 7102dfd..80c579f 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -25,7 +25,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 53
#define LIBAVFORMAT_VERSION_MINOR 0
-#define LIBAVFORMAT_VERSION_MICRO 1
+#define LIBAVFORMAT_VERSION_MICRO 3
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
OpenPOWER on IntegriCloud