Commit d4d09329 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote branch 'qatar/master'

* qatar/master:
  lavf: bump minor and add an APIChanges entry for avformat cleanup
  lavf: get rid of ffm-specific stuff in avformat.h
Not pulled:  avio: deprecate av_protocol_next().
  avio: add a function for iterating though protocol names.
  lavf: rename a parameter of av_sdp_create from buff->buf
  lavf: rename avf_sdp_create to av_sdp_create.
  lavf: make av_guess_image2_codec internal
  avio: make URLProtocol internal.
  avio: make URLContext internal.
  lavf: mark av_pkt_dump(_log) for remove on $next+1 bump.
  lavf: use designated initializers for all protocols
  applehttp: don't use deprecated url_ functions.
  avio: move two ff_udp_* functions from avio_internal to url.h
  asfdec: remove a forgotten declaration of nonexistent function
  avio: deprecate the typedef for URLInterruptCB
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents a61bc91d 0c68c804
...@@ -12,6 +12,11 @@ libavutil: 2009-03-08 ...@@ -12,6 +12,11 @@ libavutil: 2009-03-08
API changes, most recent first: API changes, most recent first:
2011-04-08 - lavf 52.106.0 - avformat.h
Minor avformat.h cleanup:
a9bf9d8 deprecate av_guess_image2_codec
c3675df rename avf_sdp_create->av_sdp_create
2011-04-03 - lavf 52.105.0 - avio.h 2011-04-03 - lavf 52.105.0 - avio.h
Large-scale renaming/deprecating of AVIOContext-related functions: Large-scale renaming/deprecating of AVIOContext-related functions:
724f6a0 deprecate url_fdopen 724f6a0 deprecate url_fdopen
......
...@@ -47,6 +47,8 @@ ...@@ -47,6 +47,8 @@
#include "libavutil/libm.h" #include "libavutil/libm.h"
#include "libavformat/os_support.h" #include "libavformat/os_support.h"
#include "libavformat/ffm.h" // not public API
#if CONFIG_AVFILTER #if CONFIG_AVFILTER
# include "libavfilter/avfilter.h" # include "libavfilter/avfilter.h"
# include "libavfilter/avfiltergraph.h" # include "libavfilter/avfiltergraph.h"
...@@ -1881,7 +1883,7 @@ static void print_sdp(AVFormatContext **avc, int n) ...@@ -1881,7 +1883,7 @@ static void print_sdp(AVFormatContext **avc, int n)
{ {
char sdp[2048]; char sdp[2048];
avf_sdp_create(avc, n, sdp, sizeof(sdp)); av_sdp_create(avc, n, sdp, sizeof(sdp));
printf("SDP:\n%s\n", sdp); printf("SDP:\n%s\n", sdp);
fflush(stdout); fflush(stdout);
} }
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <strings.h> #include <strings.h>
#include <stdlib.h> #include <stdlib.h>
#include "libavformat/avformat.h" #include "libavformat/avformat.h"
#include "libavformat/ffm.h"
#include "libavformat/network.h" #include "libavformat/network.h"
#include "libavformat/os_support.h" #include "libavformat/os_support.h"
#include "libavformat/rtpdec.h" #include "libavformat/rtpdec.h"
...@@ -2957,7 +2958,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer, ...@@ -2957,7 +2958,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
avc->streams[i]->codec = stream->streams[i]->codec; avc->streams[i]->codec = stream->streams[i]->codec;
} }
*pbuffer = av_mallocz(2048); *pbuffer = av_mallocz(2048);
avf_sdp_create(&avc, 1, *pbuffer, 2048); av_sdp_create(&avc, 1, *pbuffer, 2048);
sdp_done: sdp_done:
#if !FF_API_MAX_STREAMS #if !FF_API_MAX_STREAMS
......
...@@ -113,7 +113,7 @@ static void free_variant_list(AppleHTTPContext *c) ...@@ -113,7 +113,7 @@ static void free_variant_list(AppleHTTPContext *c)
av_free_packet(&var->pkt); av_free_packet(&var->pkt);
av_free(var->pb.buffer); av_free(var->pb.buffer);
if (var->input) if (var->input)
url_close(var->input); ffurl_close(var->input);
if (var->ctx) { if (var->ctx) {
var->ctx->pb = NULL; var->ctx->pb = NULL;
av_close_input_file(var->ctx); av_close_input_file(var->ctx);
...@@ -291,18 +291,18 @@ reload: ...@@ -291,18 +291,18 @@ reload:
goto reload; goto reload;
} }
ret = url_open(&v->input, ret = ffurl_open(&v->input,
v->segments[v->cur_seq_no - v->start_seq_no]->url, v->segments[v->cur_seq_no - v->start_seq_no]->url,
AVIO_RDONLY); AVIO_RDONLY);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
ret = url_read(v->input, buf, buf_size); ret = ffurl_read(v->input, buf, buf_size);
if (ret > 0) if (ret > 0)
return ret; return ret;
if (ret < 0 && ret != AVERROR_EOF) if (ret < 0 && ret != AVERROR_EOF)
return ret; return ret;
url_close(v->input); ffurl_close(v->input);
v->input = NULL; v->input = NULL;
v->cur_seq_no++; v->cur_seq_no++;
...@@ -435,7 +435,7 @@ static int recheck_discard_flags(AVFormatContext *s, int first) ...@@ -435,7 +435,7 @@ static int recheck_discard_flags(AVFormatContext *s, int first)
av_log(s, AV_LOG_INFO, "Now receiving variant %d\n", i); av_log(s, AV_LOG_INFO, "Now receiving variant %d\n", i);
} else if (first && !v->cur_needed && v->needed) { } else if (first && !v->cur_needed && v->needed) {
if (v->input) if (v->input)
url_close(v->input); ffurl_close(v->input);
v->input = NULL; v->input = NULL;
v->needed = 0; v->needed = 0;
changed = 1; changed = 1;
...@@ -517,7 +517,7 @@ static int applehttp_read_seek(AVFormatContext *s, int stream_index, ...@@ -517,7 +517,7 @@ static int applehttp_read_seek(AVFormatContext *s, int stream_index,
struct variant *var = c->variants[i]; struct variant *var = c->variants[i];
int64_t pos = 0; int64_t pos = 0;
if (var->input) { if (var->input) {
url_close(var->input); ffurl_close(var->input);
var->input = NULL; var->input = NULL;
} }
av_free_packet(&var->pkt); av_free_packet(&var->pkt);
......
...@@ -298,11 +298,9 @@ static int applehttp_close(URLContext *h) ...@@ -298,11 +298,9 @@ static int applehttp_close(URLContext *h)
} }
URLProtocol ff_applehttp_protocol = { URLProtocol ff_applehttp_protocol = {
"applehttp", .name = "applehttp",
applehttp_open, .url_open = applehttp_open,
applehttp_read, .url_read = applehttp_read,
NULL, /* write */ .url_close = applehttp_close,
NULL, /* seek */ .flags = URL_PROTOCOL_FLAG_NESTED_SCHEME,
applehttp_close,
.flags = URL_PROTOCOL_FLAG_NESTED_SCHEME,
}; };
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "asfcrypt.h" #include "asfcrypt.h"
#include "avlanguage.h" #include "avlanguage.h"
void ff_mms_set_stream_selection(URLContext *h, AVFormatContext *format);
typedef struct { typedef struct {
int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID
ASFStream streams[128]; ///< it's max number and it's not that big ASFStream streams[128]; ///< it's max number and it's not that big
......
...@@ -907,7 +907,9 @@ AVInputFormat *av_iformat_next(AVInputFormat *f); ...@@ -907,7 +907,9 @@ AVInputFormat *av_iformat_next(AVInputFormat *f);
*/ */
AVOutputFormat *av_oformat_next(AVOutputFormat *f); AVOutputFormat *av_oformat_next(AVOutputFormat *f);
enum CodecID av_guess_image2_codec(const char *filename); #if FF_API_GUESS_IMG2_CODEC
attribute_deprecated enum CodecID av_guess_image2_codec(const char *filename);
#endif
/* XXX: Use automatic init with either ELF sections or C file parser */ /* XXX: Use automatic init with either ELF sections or C file parser */
/* modules. */ /* modules. */
...@@ -986,7 +988,6 @@ void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size); ...@@ -986,7 +988,6 @@ void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size);
*/ */
void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st); void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st);
attribute_deprecated void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload);
/** /**
* Send a nice dump of a packet to the log. * Send a nice dump of a packet to the log.
...@@ -1002,7 +1003,10 @@ attribute_deprecated void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload); ...@@ -1002,7 +1003,10 @@ attribute_deprecated void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload);
void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload, void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
AVStream *st); AVStream *st);
#if FF_API_PKT_DUMP
attribute_deprecated void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload);
attribute_deprecated void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, attribute_deprecated void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt,
#endif
int dump_payload); int dump_payload);
/** /**
...@@ -1521,12 +1525,6 @@ int64_t parse_date(const char *datestr, int duration); ...@@ -1521,12 +1525,6 @@ int64_t parse_date(const char *datestr, int duration);
*/ */
int64_t av_gettime(void); int64_t av_gettime(void);
/* ffm-specific for ffserver */
#define FFM_PACKET_SIZE 4096
int64_t ffm_read_write_index(int fd);
int ffm_write_write_index(int fd, int64_t pos);
void ffm_set_write_index(AVFormatContext *s, int64_t pos, int64_t file_size);
#if FF_API_FIND_INFO_TAG #if FF_API_FIND_INFO_TAG
/** /**
* @deprecated use av_find_info_tag in libavutil instead. * @deprecated use av_find_info_tag in libavutil instead.
...@@ -1566,12 +1564,16 @@ int av_filename_number_test(const char *filename); ...@@ -1566,12 +1564,16 @@ int av_filename_number_test(const char *filename);
* all the contexts in the array (an AVCodecContext per RTP stream) * all the contexts in the array (an AVCodecContext per RTP stream)
* must contain only one AVStream. * must contain only one AVStream.
* @param n_files number of AVCodecContexts contained in ac * @param n_files number of AVCodecContexts contained in ac
* @param buff buffer where the SDP will be stored (must be allocated by * @param buf buffer where the SDP will be stored (must be allocated by
* the caller) * the caller)
* @param size the size of the buffer * @param size the size of the buffer
* @return 0 if OK, AVERROR_xxx on error * @return 0 if OK, AVERROR_xxx on error
*/ */
int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size); int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size);
#if FF_API_SDP_CREATE
attribute_deprecated int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size);
#endif
/** /**
* Return a positive value if the given filename has one of the given * Return a positive value if the given filename has one of the given
......
...@@ -49,7 +49,7 @@ static const AVClass urlcontext_class = ...@@ -49,7 +49,7 @@ static const AVClass urlcontext_class =
static int default_interrupt_cb(void); static int default_interrupt_cb(void);
URLProtocol *first_protocol = NULL; URLProtocol *first_protocol = NULL;
URLInterruptCB *url_interrupt_cb = default_interrupt_cb; int (*url_interrupt_cb)(void) = default_interrupt_cb;
URLProtocol *av_protocol_next(URLProtocol *p) URLProtocol *av_protocol_next(URLProtocol *p)
{ {
...@@ -57,6 +57,16 @@ URLProtocol *av_protocol_next(URLProtocol *p) ...@@ -57,6 +57,16 @@ URLProtocol *av_protocol_next(URLProtocol *p)
else return first_protocol; else return first_protocol;
} }
const char *avio_enum_protocols(void **opaque, int output)
{
URLProtocol **p = opaque;
*p = *p ? (*p)->next : first_protocol;
if (!*p) return NULL;
if ((output && (*p)->url_write) || (!output && (*p)->url_read))
return (*p)->name;
return avio_enum_protocols(opaque, output);
}
int ffurl_register_protocol(URLProtocol *protocol, int size) int ffurl_register_protocol(URLProtocol *protocol, int size)
{ {
URLProtocol **p; URLProtocol **p;
...@@ -389,7 +399,7 @@ static int default_interrupt_cb(void) ...@@ -389,7 +399,7 @@ static int default_interrupt_cb(void)
return 0; return 0;
} }
void avio_set_interrupt_cb(URLInterruptCB *interrupt_cb) void avio_set_interrupt_cb(int (*interrupt_cb)(void))
{ {
if (!interrupt_cb) if (!interrupt_cb)
interrupt_cb = default_interrupt_cb; interrupt_cb = default_interrupt_cb;
......
...@@ -37,12 +37,14 @@ ...@@ -37,12 +37,14 @@
/* unbuffered I/O */ /* unbuffered I/O */
#if FF_API_OLD_AVIO
/** /**
* URL Context. * URL Context.
* New fields can be added to the end with minor version bumps. * New fields can be added to the end with minor version bumps.
* Removal, reordering and changes to existing fields require a major * Removal, reordering and changes to existing fields require a major
* version bump. * version bump.
* sizeof(URLContext) must not be used outside libav*. * sizeof(URLContext) must not be used outside libav*.
* @deprecated This struct will be made private
*/ */
typedef struct URLContext { typedef struct URLContext {
#if FF_API_URL_CLASS #if FF_API_URL_CLASS
...@@ -57,7 +59,6 @@ typedef struct URLContext { ...@@ -57,7 +59,6 @@ typedef struct URLContext {
int is_connected; int is_connected;
} URLContext; } URLContext;
#if FF_API_OLD_AVIO
typedef struct URLPollEntry { typedef struct URLPollEntry {
URLContext *handle; URLContext *handle;
int events; int events;
...@@ -90,11 +91,9 @@ typedef struct URLPollEntry { ...@@ -90,11 +91,9 @@ typedef struct URLPollEntry {
* silently ignored. * silently ignored.
*/ */
#define URL_FLAG_NONBLOCK 4 #define URL_FLAG_NONBLOCK 4
#endif
typedef int URLInterruptCB(void); typedef int URLInterruptCB(void);
#if FF_API_OLD_AVIO
/** /**
* @defgroup old_url_funcs Old url_* functions * @defgroup old_url_funcs Old url_* functions
* @deprecated use the buffered API based on AVIOContext instead * @deprecated use the buffered API based on AVIOContext instead
...@@ -117,7 +116,7 @@ attribute_deprecated void url_get_filename(URLContext *h, char *buf, int buf_siz ...@@ -117,7 +116,7 @@ attribute_deprecated void url_get_filename(URLContext *h, char *buf, int buf_siz
attribute_deprecated int av_url_read_pause(URLContext *h, int pause); attribute_deprecated int av_url_read_pause(URLContext *h, int pause);
attribute_deprecated int64_t av_url_read_seek(URLContext *h, int stream_index, attribute_deprecated int64_t av_url_read_seek(URLContext *h, int stream_index,
int64_t timestamp, int flags); int64_t timestamp, int flags);
attribute_deprecated void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); attribute_deprecated void url_set_interrupt_cb(int (*interrupt_cb)(void));
#endif #endif
/** /**
...@@ -132,7 +131,7 @@ int url_exist(const char *url); ...@@ -132,7 +131,7 @@ int url_exist(const char *url);
* in this case by the interrupted function. 'NULL' means no interrupt * in this case by the interrupted function. 'NULL' means no interrupt
* callback is given. * callback is given.
*/ */
void avio_set_interrupt_cb(URLInterruptCB *interrupt_cb); void avio_set_interrupt_cb(int (*interrupt_cb)(void));
#if FF_API_OLD_AVIO #if FF_API_OLD_AVIO
/* not implemented */ /* not implemented */
...@@ -140,8 +139,11 @@ attribute_deprecated int url_poll(URLPollEntry *poll_table, int n, int timeout); ...@@ -140,8 +139,11 @@ attribute_deprecated int url_poll(URLPollEntry *poll_table, int n, int timeout);
#define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */ #define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */
#endif
/**
* @deprecated This struct is to be made private. Use the higher-level
* AVIOContext-based API instead.
*/
typedef struct URLProtocol { typedef struct URLProtocol {
const char *name; const char *name;
int (*url_open)(URLContext *h, const char *url, int flags); int (*url_open)(URLContext *h, const char *url, int flags);
...@@ -158,6 +160,7 @@ typedef struct URLProtocol { ...@@ -158,6 +160,7 @@ typedef struct URLProtocol {
const AVClass *priv_data_class; const AVClass *priv_data_class;
int flags; int flags;
} URLProtocol; } URLProtocol;
#endif
#if FF_API_REGISTER_PROTOCOL #if FF_API_REGISTER_PROTOCOL
extern URLProtocol *first_protocol; extern URLProtocol *first_protocol;
...@@ -596,4 +599,18 @@ int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); ...@@ -596,4 +599,18 @@ int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
int udp_get_file_handle(URLContext *h); int udp_get_file_handle(URLContext *h);
#endif #endif
/**
* Iterate through names of available protocols.
* @note it is recommanded to use av_protocol_next() instead of this
*
* @param opaque A private pointer representing current protocol.
* It must be a pointer to NULL on first iteration and will
* be updated by successive calls to avio_enum_protocols.
* @param output If set to 1, iterate over output protocols,
* otherwise over input protocols.
*
* @return A static string containing the name of current protocol or NULL
*/
const char *avio_enum_protocols(void **opaque, int output);
#endif /* AVFORMAT_AVIO_H */ #endif /* AVFORMAT_AVIO_H */
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#define AVFORMAT_AVIO_INTERNAL_H #define AVFORMAT_AVIO_INTERNAL_H
#include "avio.h" #include "avio.h"
#include "url.h"
int ffio_init_context(AVIOContext *s, int ffio_init_context(AVIOContext *s,
unsigned char *buffer, unsigned char *buffer,
...@@ -92,10 +93,6 @@ int ffio_read_pause(AVIOContext *h, int pause); ...@@ -92,10 +93,6 @@ int ffio_read_pause(AVIOContext *h, int pause);
int64_t ffio_read_seek (AVIOContext *h, int stream_index, int64_t ffio_read_seek (AVIOContext *h, int stream_index,
int64_t timestamp, int flags); int64_t timestamp, int flags);
/* udp.c */
int ff_udp_set_remote_url(URLContext *h, const char *uri);
int ff_udp_get_local_port(URLContext *h);
void ffio_init_checksum(AVIOContext *s, void ffio_init_checksum(AVIOContext *s,
unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len),
unsigned long checksum); unsigned long checksum);
......
...@@ -190,10 +190,9 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence) ...@@ -190,10 +190,9 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence)
} }
URLProtocol ff_concat_protocol = { URLProtocol ff_concat_protocol = {
"concat", .name = "concat",
concat_open, .url_open = concat_open,
concat_read, .url_read = concat_read,
NULL, .url_seek = concat_seek,
concat_seek, .url_close = concat_close,
concat_close,
}; };
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
/* The FFM file is made of blocks of fixed size */ /* The FFM file is made of blocks of fixed size */
#define FFM_HEADER_SIZE 14 #define FFM_HEADER_SIZE 14
#define FFM_PACKET_SIZE 4096
#define PACKET_ID 0x666d #define PACKET_ID 0x666d
/* each packet contains frames (which can span several packets */ /* each packet contains frames (which can span several packets */
...@@ -55,4 +56,8 @@ typedef struct FFMContext { ...@@ -55,4 +56,8 @@ typedef struct FFMContext {
uint8_t packet[FFM_PACKET_SIZE]; uint8_t packet[FFM_PACKET_SIZE];
} FFMContext; } FFMContext;
int64_t ffm_read_write_index(int fd);
int ffm_write_write_index(int fd, int64_t pos);
void ffm_set_write_index(AVFormatContext *s, int64_t pos, int64_t file_size);
#endif /* AVFORMAT_FFM_H */ #endif /* AVFORMAT_FFM_H */
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <stdlib.h> #include <stdlib.h>
#include "os_support.h" #include "os_support.h"
#include "url.h"
/* standard file protocol */ /* standard file protocol */
...@@ -95,12 +96,12 @@ static int file_close(URLContext *h) ...@@ -95,12 +96,12 @@ static int file_close(URLContext *h)
} }
URLProtocol ff_file_protocol = { URLProtocol ff_file_protocol = {
"file", .name = "file",
file_open, .url_open = file_open,
file_read, .url_read = file_read,
file_write, .url_write = file_write,
file_seek, .url_seek = file_seek,
file_close, .url_close = file_close,
.url_get_file_handle = file_get_handle, .url_get_file_handle = file_get_handle,
}; };
...@@ -131,10 +132,10 @@ static int pipe_open(URLContext *h, const char *filename, int flags) ...@@ -131,10 +132,10 @@ static int pipe_open(URLContext *h, const char *filename, int flags)
} }
URLProtocol ff_pipe_protocol = { URLProtocol ff_pipe_protocol = {
"pipe", .name = "pipe",
pipe_open, .url_open = pipe_open,
file_read, .url_read = file_read,
file_write, .url_write = file_write,
.url_get_file_handle = file_get_handle, .url_get_file_handle = file_get_handle,
}; };
......
...@@ -121,10 +121,9 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size) ...@@ -121,10 +121,9 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size)
URLProtocol ff_gopher_protocol = { URLProtocol ff_gopher_protocol = {
"gopher", .name = "gopher",
gopher_open, .url_open = gopher_open,
gopher_read, .url_read = gopher_read,
gopher_write, .url_write = gopher_write,
NULL, /*seek*/ .url_close = gopher_close,
gopher_close,
}; };
...@@ -505,13 +505,13 @@ http_get_file_handle(URLContext *h) ...@@ -505,13 +505,13 @@ http_get_file_handle(URLContext *h)
} }
URLProtocol ff_http_protocol = { URLProtocol ff_http_protocol = {
"http", .name = "http",
http_open, .url_open = http_open,
http_read, .url_read = http_read,
http_write, .url_write = http_write,
http_seek, .url_seek = http_seek,
http_close, .url_close = http_close,
.url_get_file_handle = http_get_file_handle, .url_get_file_handle = http_get_file_handle,
.priv_data_size = sizeof(HTTPContext), .priv_data_size = sizeof(HTTPContext),
.priv_data_class = &httpcontext_class, .priv_data_class = &httpcontext_class,
}; };
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#ifndef AVFORMAT_HTTP_H #ifndef AVFORMAT_HTTP_H
#define AVFORMAT_HTTP_H #define AVFORMAT_HTTP_H
#include "avio.h" #include "url.h"
/** /**
* Set custom HTTP headers. * Set custom HTTP headers.
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "avformat.h" #include "avformat.h"
#include "avio_internal.h" #include "avio_internal.h"
#include "internal.h"
#include <strings.h> #include <strings.h>
typedef struct { typedef struct {
...@@ -185,9 +186,16 @@ static int read_probe(AVProbeData *p) ...@@ -185,9 +186,16 @@ static int read_probe(AVProbeData *p)
return 0; return 0;
} }
enum CodecID ff_guess_image2_codec(const char *filename)
{
return av_str2id(img_tags, filename);
}
#if FF_API_GUESS_IMG2_CODEC
enum CodecID av_guess_image2_codec(const char *filename){ enum CodecID av_guess_image2_codec(const char *filename){
return av_str2id(img_tags, filename); return av_str2id(img_tags, filename);
} }
#endif
static int read_header(AVFormatContext *s1, AVFormatParameters *ap) static int read_header(AVFormatContext *s1, AVFormatParameters *ap)
{ {
......
...@@ -250,4 +250,6 @@ void ff_reduce_index(AVFormatContext *s, int stream_index); ...@@ -250,4 +250,6 @@ void ff_reduce_index(AVFormatContext *s, int stream_index);
void ff_make_absolute_url(char *buf, int size, const char *base, void ff_make_absolute_url(char *buf, int size, const char *base,
const char *rel); const char *rel);
enum CodecID ff_guess_image2_codec(const char *filename);
#endif /* AVFORMAT_INTERNAL_H */ #endif /* AVFORMAT_INTERNAL_H */
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
*/ */
#include "avformat.h" #include "avformat.h"
#include "url.h"
#include <librtmp/rtmp.h> #include <librtmp/rtmp.h>
#include <librtmp/log.h> #include <librtmp/log.h>
...@@ -158,66 +159,56 @@ static int rtmp_get_file_handle(URLContext *s) ...@@ -158,66 +159,56 @@ static int rtmp_get_file_handle(URLContext *s)
} }
URLProtocol ff_rtmp_protocol = { URLProtocol ff_rtmp_protocol = {
"rtmp", .name = "rtmp",
rtmp_open, .url_open = rtmp_open,
rtmp_read, .url_read = rtmp_read,
rtmp_write, .url_write = rtmp_write,
NULL, /* seek */ .url_close = rtmp_close,
rtmp_close, .url_read_pause = rtmp_read_pause,
NULL, /* next */ .url_read_seek = rtmp_read_seek,
rtmp_read_pause, .url_get_file_handle = rtmp_get_file_handle
rtmp_read_seek,
rtmp_get_file_handle
}; };
URLProtocol ff_rtmpt_protocol = { URLProtocol ff_rtmpt_protocol = {
"rtmpt", .name = "rtmpt",
rtmp_open, .url_open = rtmp_open,
rtmp_read, .url_read = rtmp_read,
rtmp_write, .url_write = rtmp_write,
NULL, /* seek */ .url_close = rtmp_close,
rtmp_close, .url_read_pause = rtmp_read_pause,
NULL, /* next */ .url_read_seek = rtmp_read_seek,
rtmp_read_pause, .url_get_file_handle = rtmp_get_file_handle
rtmp_read_seek,
rtmp_get_file_handle
}; };
URLProtocol ff_rtmpe_protocol = { URLProtocol ff_rtmpe_protocol = {
"rtmpe", .name = "rtmpe",
rtmp_open, .url_open = rtmp_open,
rtmp_read, .url_read = rtmp_read,
rtmp_write, .url_write = rtmp_write,
NULL, /* seek */ .url_close = rtmp_close,
rtmp_close, .url_read_pause = rtmp_read_pause,
NULL, /* next */ .url_read_seek = rtmp_read_seek,
rtmp_read_pause, .url_get_file_handle = rtmp_get_file_handle
rtmp_read_seek,
rtmp_get_file_handle
}; };
URLProtocol ff_rtmpte_protocol = { URLProtocol ff_rtmpte_protocol = {
"rtmpte", .name = "rtmpte",
rtmp_open, .url_open = rtmp_open,
rtmp_read, .url_read = rtmp_read,
rtmp_write, .url_write = rtmp_write,
NULL, /* seek */ .url_close = rtmp_close,
rtmp_close, .url_read_pause = rtmp_read_pause,
NULL, /* next */ .url_read_seek = rtmp_read_seek,
rtmp_read_pause, .url_get_file_handle = rtmp_get_file_handle
rtmp_read_seek,
rtmp_get_file_handle
}; };
URLProtocol ff_rtmps_protocol = { URLProtocol ff_rtmps_protocol = {
"rtmps", .name = "rtmps",
rtmp_open, .url_open = rtmp_open,
rtmp_read, .url_read = rtmp_read,
rtmp_write, .url_write = rtmp_write,
NULL, /* seek */ .url_close = rtmp_close,
rtmp_close, .url_read_pause = rtmp_read_pause,
NULL, /* next */ .url_read_seek = rtmp_read_seek,
rtmp_read_pause, .url_get_file_handle = rtmp_get_file_handle
rtmp_read_seek,
rtmp_get_file_handle
}; };
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#ifndef AVFORMAT_MMS_H #ifndef AVFORMAT_MMS_H
#define AVFORMAT_MMS_H #define AVFORMAT_MMS_H
#include "avformat.h" #include "url.h"
typedef struct { typedef struct {
int id; int id;
......
...@@ -623,10 +623,8 @@ static int mms_read(URLContext *h, uint8_t *buf, int size) ...@@ -623,10 +623,8 @@ static int mms_read(URLContext *h, uint8_t *buf, int size)
} }
URLProtocol ff_mmst_protocol = { URLProtocol ff_mmst_protocol = {
"mmst", .name = "mmst",
mms_open, .url_open = mms_open,
mms_read, .url_read = mms_read,
NULL, // write .url_close = mms_close,
NULL, // seek
mms_close,
}; };
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define AVFORMAT_RTMPPKT_H #define AVFORMAT_RTMPPKT_H
#include "avformat.h" #include "avformat.h"
#include "url.h"
/** maximum possible number of different RTMP channels */ /** maximum possible number of different RTMP channels */
#define RTMP_CHANNELS 65599 #define RTMP_CHANNELS 65599
......
...@@ -991,10 +991,9 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) ...@@ -991,10 +991,9 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
} }
URLProtocol ff_rtmp_protocol = { URLProtocol ff_rtmp_protocol = {
"rtmp", .name = "rtmp",
rtmp_open, .url_open = rtmp_open,
rtmp_read, .url_read = rtmp_read,
rtmp_write, .url_write = rtmp_write,
NULL, /* seek */ .url_close = rtmp_close,
rtmp_close,
}; };
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "libavcodec/avcodec.h" #include "libavcodec/avcodec.h"
#include "avformat.h" #include "avformat.h"
#include "rtp.h" #include "rtp.h"
#include "url.h"
typedef struct PayloadContext PayloadContext; typedef struct PayloadContext PayloadContext;
typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler; typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define AVFORMAT_RTPENC_CHAIN_H #define AVFORMAT_RTPENC_CHAIN_H
#include "avformat.h" #include "avformat.h"
#include "url.h"
AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
URLContext *handle, int packet_size); URLContext *handle, int packet_size);
......
...@@ -355,11 +355,10 @@ int rtp_get_rtcp_file_handle(URLContext *h) { ...@@ -355,11 +355,10 @@ int rtp_get_rtcp_file_handle(URLContext *h) {
} }
URLProtocol ff_rtp_protocol = { URLProtocol ff_rtp_protocol = {
"rtp", .name = "rtp",
rtp_open, .url_open = rtp_open,
rtp_read, .url_read = rtp_read,
rtp_write, .url_write = rtp_write,
NULL, /* seek */ .url_close = rtp_close,
rtp_close,
.url_get_file_handle = rtp_get_file_handle, .url_get_file_handle = rtp_get_file_handle,
}; };
...@@ -66,7 +66,7 @@ int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr) ...@@ -66,7 +66,7 @@ int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr)
ff_url_join(sdp_ctx.filename, sizeof(sdp_ctx.filename), ff_url_join(sdp_ctx.filename, sizeof(sdp_ctx.filename),
"rtsp", NULL, addr, -1, NULL); "rtsp", NULL, addr, -1, NULL);
ctx_array[0] = &sdp_ctx; ctx_array[0] = &sdp_ctx;
if (avf_sdp_create(ctx_array, 1, sdp, SDP_MAX_SIZE)) { if (av_sdp_create(ctx_array, 1, sdp, SDP_MAX_SIZE)) {
av_free(sdp); av_free(sdp);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
......
...@@ -208,7 +208,7 @@ static int sap_write_header(AVFormatContext *s) ...@@ -208,7 +208,7 @@ static int sap_write_header(AVFormatContext *s)
av_strlcpy(&sap->ann[pos], "application/sdp", sap->ann_size - pos); av_strlcpy(&sap->ann[pos], "application/sdp", sap->ann_size - pos);
pos += strlen(&sap->ann[pos]) + 1; pos += strlen(&sap->ann[pos]) + 1;
if (avf_sdp_create(contexts, s->nb_streams, &sap->ann[pos], if (av_sdp_create(contexts, s->nb_streams, &sap->ann[pos],
sap->ann_size - pos)) { sap->ann_size - pos)) {
ret = AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
goto fail; goto fail;
......
...@@ -474,14 +474,14 @@ void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *des ...@@ -474,14 +474,14 @@ void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *des
sdp_write_media_attributes(buff, size, c, payload_type); sdp_write_media_attributes(buff, size, c, payload_type);
} }
int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size) int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
{ {
AVMetadataTag *title = av_metadata_get(ac[0]->metadata, "title", NULL, 0); AVMetadataTag *title = av_metadata_get(ac[0]->metadata, "title", NULL, 0);
struct sdp_session_level s; struct sdp_session_level s;
int i, j, port, ttl, is_multicast; int i, j, port, ttl, is_multicast;
char dst[32], dst_type[5]; char dst[32], dst_type[5];
memset(buff, 0, size); memset(buf, 0, size);
memset(&s, 0, sizeof(struct sdp_session_level)); memset(&s, 0, sizeof(struct sdp_session_level));
s.user = "-"; s.user = "-";
s.src_addr = "127.0.0.1"; /* FIXME: Properly set this */ s.src_addr = "127.0.0.1"; /* FIXME: Properly set this */
...@@ -506,7 +506,7 @@ int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size) ...@@ -506,7 +506,7 @@ int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
} }
} }
} }
sdp_write_header(buff, size, &s); sdp_write_header(buf, size, &s);
dst[0] = 0; dst[0] = 0;
for (i = 0; i < n_files; i++) { for (i = 0; i < n_files; i++) {
...@@ -518,11 +518,11 @@ int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size) ...@@ -518,11 +518,11 @@ int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
ttl = 0; ttl = 0;
} }
for (j = 0; j < ac[i]->nb_streams; j++) { for (j = 0; j < ac[i]->nb_streams; j++) {
ff_sdp_write_media(buff, size, ff_sdp_write_media(buf, size,
ac[i]->streams[j]->codec, dst[0] ? dst : NULL, ac[i]->streams[j]->codec, dst[0] ? dst : NULL,
dst_type, (port > 0) ? port + j * 2 : 0, ttl); dst_type, (port > 0) ? port + j * 2 : 0, ttl);
if (port <= 0) { if (port <= 0) {
av_strlcatf(buff, size, av_strlcatf(buf, size,
"a=control:streamid=%d\r\n", i + j); "a=control:streamid=%d\r\n", i + j);
} }
} }
...@@ -531,7 +531,7 @@ int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size) ...@@ -531,7 +531,7 @@ int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
return 0; return 0;
} }
#else #else
int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size) int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
{ {
return AVERROR(ENOSYS); return AVERROR(ENOSYS);
} }
...@@ -540,3 +540,10 @@ void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *des ...@@ -540,3 +540,10 @@ void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *des
{ {
} }
#endif #endif
#if FF_API_SDP_CREATE
int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
{
return av_sdp_create(ac, n_files, buff, size);
}
#endif
...@@ -202,11 +202,10 @@ static int tcp_get_file_handle(URLContext *h) ...@@ -202,11 +202,10 @@ static int tcp_get_file_handle(URLContext *h)
} }
URLProtocol ff_tcp_protocol = { URLProtocol ff_tcp_protocol = {
"tcp", .name = "tcp",
tcp_open, .url_open = tcp_open,
tcp_read, .url_read = tcp_read,
tcp_write, .url_write = tcp_write,
NULL, /* seek */ .url_close = tcp_close,
tcp_close,
.url_get_file_handle = tcp_get_file_handle, .url_get_file_handle = tcp_get_file_handle,
}; };
...@@ -489,11 +489,10 @@ static int udp_close(URLContext *h) ...@@ -489,11 +489,10 @@ static int udp_close(URLContext *h)
} }
URLProtocol ff_udp_protocol = { URLProtocol ff_udp_protocol = {
"udp", .name = "udp",
udp_open, .url_open = udp_open,
udp_read, .url_read = udp_read,
udp_write, .url_write = udp_write,
NULL, /* seek */ .url_close = udp_close,
udp_close,
.url_get_file_handle = udp_get_file_handle, .url_get_file_handle = udp_get_file_handle,
}; };
...@@ -31,7 +31,35 @@ ...@@ -31,7 +31,35 @@
#if !FF_API_OLD_AVIO #if !FF_API_OLD_AVIO
#define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */ #define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */
extern URLInterruptCB *url_interrupt_cb; extern int (*url_interrupt_cb)(void);
typedef struct URLContext {
const AVClass *av_class; /**< information for av_log(). Set by url_open(). */
struct URLProtocol *prot;
void *priv_data;
char *filename; /**< specified URL */
int flags;
int max_packet_size; /**< if non zero, the stream is packetized with this max packet size */
int is_streamed; /**< true if streamed (no seek possible), default = false */
int is_connected;
} URLContext;
typedef struct URLProtocol {
const char *name;
int (*url_open)( URLContext *h, const char *url, int flags);
int (*url_read)( URLContext *h, unsigned char *buf, int size);
int (*url_write)(URLContext *h, const unsigned char *buf, int size);
int64_t (*url_seek)( URLContext *h, int64_t pos, int whence);
int (*url_close)(URLContext *h);
struct URLProtocol *next;
int (*url_read_pause)(URLContext *h, int pause);
int64_t (*url_read_seek)(URLContext *h, int stream_index,
int64_t timestamp, int flags);
int (*url_get_file_handle)(URLContext *h);
int priv_data_size;
const AVClass *priv_data_class;
int flags;
} URLProtocol;
#endif #endif
/** /**
...@@ -140,4 +168,8 @@ int ffurl_get_file_handle(URLContext *h); ...@@ -140,4 +168,8 @@ int ffurl_get_file_handle(URLContext *h);
*/ */
int ffurl_register_protocol(URLProtocol *protocol, int size); int ffurl_register_protocol(URLProtocol *protocol, int size);
/* udp.c */
int ff_udp_set_remote_url(URLContext *h, const char *uri);
int ff_udp_get_local_port(URLContext *h);
#endif //AVFORMAT_URL_H #endif //AVFORMAT_URL_H
...@@ -219,7 +219,7 @@ AVOutputFormat *av_guess_format(const char *short_name, const char *filename, ...@@ -219,7 +219,7 @@ AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
#if CONFIG_IMAGE2_MUXER #if CONFIG_IMAGE2_MUXER
if (!short_name && filename && if (!short_name && filename &&
av_filename_number_test(filename) && av_filename_number_test(filename) &&
av_guess_image2_codec(filename) != CODEC_ID_NONE) { ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
return av_guess_format("image2", NULL, NULL); return av_guess_format("image2", NULL, NULL);
} }
#endif #endif
...@@ -272,7 +272,7 @@ enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, ...@@ -272,7 +272,7 @@ enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
#if CONFIG_IMAGE2_MUXER #if CONFIG_IMAGE2_MUXER
if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){ if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
codec_id= av_guess_image2_codec(filename); codec_id= ff_guess_image2_codec(filename);
} }
#endif #endif
if(codec_id == CODEC_ID_NONE) if(codec_id == CODEC_ID_NONE)
...@@ -3574,22 +3574,26 @@ static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int ...@@ -3574,22 +3574,26 @@ static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int
av_hex_dump(f, pkt->data, pkt->size); av_hex_dump(f, pkt->data, pkt->size);
} }
#if FF_API_PKT_DUMP
void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload) void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
{ {
AVRational tb = { 1, AV_TIME_BASE }; AVRational tb = { 1, AV_TIME_BASE };
pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb); pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
} }
#endif
void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st) void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
{ {
pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base); pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
} }
#if FF_API_PKT_DUMP
void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload) void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
{ {
AVRational tb = { 1, AV_TIME_BASE }; AVRational tb = { 1, AV_TIME_BASE };
pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb); pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
} }
#endif
void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload, void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
AVStream *st) AVStream *st)
......
...@@ -104,5 +104,14 @@ ...@@ -104,5 +104,14 @@
#ifndef FF_API_FIND_INFO_TAG #ifndef FF_API_FIND_INFO_TAG
#define FF_API_FIND_INFO_TAG (LIBAVFORMAT_VERSION_MAJOR < 54) #define FF_API_FIND_INFO_TAG (LIBAVFORMAT_VERSION_MAJOR < 54)
#endif #endif
#ifndef FF_API_PKT_DUMP
#define FF_API_PKT_DUMP (LIBAVFORMAT_VERSION_MAJOR < 54)
#endif
#ifndef FF_API_GUESS_IMG2_CODEC
#define FF_API_GUESS_IMG2_CODEC (LIBAVFORMAT_VERSION_MAJOR < 54)
#endif
#ifndef FF_API_SDP_CREATE
#define FF_API_SDP_CREATE (LIBAVFORMAT_VERSION_MAJOR < 54)
#endif
#endif //AVFORMAT_VERSION_H #endif //AVFORMAT_VERSION_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment