Merge remote-tracking branch 'qatar/master'

* qatar/master:
  mpegvideo_enc: don't use deprecated avcodec_encode_video().
  cmdutils: refactor -codecs option.
  avconv: make -shortest a per-output file option.
  lavc: add avcodec_descriptor_get_by_name().
  lavc: add const to AVCodec* function parameters.
  swf(dec): replace CODEC_ID with AV_CODEC_ID
  dvenc: don't use deprecated AVCODEC_MAX_AUDIO_FRAME_SIZE
  rtmpdh: Do not generate the same private key every time when using libnettle
  rtp: remove ff_rtp_get_rtcp_file_handle().
  rtsp.c: use ffurl_get_multi_file_handle() instead of ff_rtp_get_rtcp_file_handle()
  avio: add (ff)url_get_multi_file_handle() for getting more than one fd
  h264: vdpau: fix crash with unsupported colorspace
  amrwbdec: Decode the fr_quality bit properly

Conflicts:
	Changelog
	cmdutils.c
	cmdutils_common_opts.h
	doc/ffmpeg.texi
	ffmpeg.c
	ffmpeg.h
	ffmpeg_opt.c
	libavcodec/h264.c
	libavcodec/options.c
	libavcodec/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
pull/28/head
Michael Niedermayer 12 years ago
commit 6c180b35c4
  1. 1
      Changelog
  2. 185
      cmdutils.c
  3. 14
      cmdutils.h
  4. 4
      cmdutils_common_opts.h
  5. 25
      doc/avtools-common-opts.texi
  6. 2
      doc/ffmpeg.texi
  7. 18
      ffmpeg.c
  8. 4
      ffmpeg.h
  9. 3
      ffmpeg_opt.c
  10. 2
      libavcodec/amrwbdec.c
  11. 20
      libavcodec/avcodec.h
  12. 13
      libavcodec/codec_desc.c
  13. 31
      libavcodec/mpegvideo_enc.c
  14. 6
      libavcodec/options.c
  15. 11
      libavcodec/utils.c
  16. 15
      libavformat/avio.c
  17. 6
      libavformat/dvenc.c
  18. 10
      libavformat/rtmpdh.c
  19. 5
      libavformat/rtpdec.h
  20. 29
      libavformat/rtpproto.c
  21. 20
      libavformat/rtsp.c
  22. 6
      libavformat/swf.c
  23. 12
      libavformat/swfdec.c
  24. 9
      libavformat/url.h

@ -49,6 +49,7 @@ version next:
- SubRip encoder and decoder without embedded timing
- edge detection filter
- framestep filter
- ffmpeg -shortest option is now per-output file
version 0.11:

@ -801,90 +801,127 @@ int opt_formats(const char *opt, const char *arg)
static char get_media_type_char(enum AVMediaType type)
{
static const char map[AVMEDIA_TYPE_NB] = {
[AVMEDIA_TYPE_VIDEO] = 'V',
[AVMEDIA_TYPE_AUDIO] = 'A',
[AVMEDIA_TYPE_DATA] = 'D',
[AVMEDIA_TYPE_SUBTITLE] = 'S',
[AVMEDIA_TYPE_ATTACHMENT] = 'T',
};
return type >= 0 && type < AVMEDIA_TYPE_NB && map[type] ? map[type] : '?';
switch (type) {
case AVMEDIA_TYPE_VIDEO: return 'V';
case AVMEDIA_TYPE_AUDIO: return 'A';
case AVMEDIA_TYPE_DATA: return 'D';
case AVMEDIA_TYPE_SUBTITLE: return 'S';
case AVMEDIA_TYPE_ATTACHMENT:return 'T';
default: return '?';
}
}
int opt_codecs(const char *opt, const char *arg)
static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev,
int encoder)
{
AVCodec *p = NULL, *p2;
const char *last_name;
while ((prev = av_codec_next(prev))) {
if (prev->id == id &&
(encoder ? av_codec_is_encoder(prev) : av_codec_is_decoder(prev)))
return prev;
}
return NULL;
}
static void print_codecs_for_id(enum AVCodecID id, int encoder)
{
const AVCodec *codec = NULL;
printf(" (%s: ", encoder ? "encoders" : "decoders");
while ((codec = next_codec_for_id(id, codec, encoder)))
printf("%s ", codec->name);
printf(")");
}
int show_codecs(const char *opt, const char *arg)
{
const AVCodecDescriptor *desc = NULL;
printf("Codecs:\n"
" D....... = Decoding supported\n"
" .E...... = Encoding supported\n"
" ..V..... = Video codec\n"
" ..A..... = Audio codec\n"
" ..S..... = Subtitle codec\n"
" ...S.... = Supports draw_horiz_band\n"
" ....D... = Supports direct rendering method 1\n"
" .....T.. = Supports weird frame truncation\n"
" ......F. = Supports frame-based multi-threaded decoding\n"
" ......S. = Supports slice-based multi-threaded decoding\n"
" ......B. = Supports both frame-based and slice-based multi-threaded decoding\n"
" .......F = Supports frame-based multi-threaded encoding\n"
" .......S = Supports slice-based multi-threaded encoding\n"
" .......B = Supports both frame-based and slice-based multi-threaded encoding\n"
" --------\n");
last_name= "000";
for (;;) {
int decode = 0;
int encode = 0;
int cap = 0;
p2 = NULL;
while ((p = av_codec_next(p))) {
if ((p2 == NULL || strcmp(p->name, p2->name) < 0) &&
strcmp(p->name, last_name) > 0) {
p2 = p;
decode = encode = cap = 0;
" D... = Decoding supported\n"
" .E.. = Encoding supported\n"
" ..V. = Video codec\n"
" ..A. = Audio codec\n"
" ..S. = Subtitle codec\n"
" ...I = Intra frame-only codec\n"
" -----\n");
while ((desc = avcodec_descriptor_next(desc))) {
const AVCodec *codec = NULL;
printf(avcodec_find_decoder(desc->id) ? "D" : ".");
printf(avcodec_find_encoder(desc->id) ? "E" : ".");
printf("%c", get_media_type_char(desc->type));
printf((desc->props & AV_CODEC_PROP_INTRA_ONLY) ? "I" : ".");
printf(" %-20s %s", desc->name, desc->long_name ? desc->long_name : "");
/* print decoders/encoders when there's more than one or their
* names are different from codec name */
while ((codec = next_codec_for_id(desc->id, codec, 0))) {
if (strcmp(codec->name, desc->name)) {
print_codecs_for_id(desc->id, 0);
break;
}
if (p2 && strcmp(p->name, p2->name) == 0) {
if (av_codec_is_decoder(p))
decode = 1;
if (av_codec_is_encoder(p))
encode = 1;
cap |= p->capabilities;
}
codec = NULL;
while ((codec = next_codec_for_id(desc->id, codec, 1))) {
if (strcmp(codec->name, desc->name)) {
print_codecs_for_id(desc->id, 1);
break;
}
}
if (p2 == NULL)
break;
last_name = p2->name;
printf(" %s%s%c%s%s%s%s%s %-15s %s",
decode ? "D" : (/* p2->decoder ? "d" : */ " "),
encode ? "E" : " ",
get_media_type_char(p2->type),
cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S" : " ",
cap & CODEC_CAP_DR1 ? "D" : " ",
cap & CODEC_CAP_TRUNCATED ? "T" : " ",
decode ?
cap & CODEC_CAP_FRAME_THREADS ? cap & CODEC_CAP_SLICE_THREADS ? "B" : "F" :
cap & CODEC_CAP_SLICE_THREADS ? "S" : " "
: " ",
encode ?
cap & CODEC_CAP_FRAME_THREADS ? cap & CODEC_CAP_SLICE_THREADS ? "B" : "F" :
cap & CODEC_CAP_SLICE_THREADS ? "S" : " "
: " ",
p2->name,
p2->long_name ? p2->long_name : "");
#if 0
if (p2->decoder && decode == 0)
printf(" use %s for decoding", p2->decoder->name);
#endif
printf("\n");
}
printf("\n");
printf("Note, the names of encoders and decoders do not always match, so there are\n"
"several cases where the above table shows encoder only or decoder only entries\n"
"even though both encoding and decoding are supported. For example, the h263\n"
"decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
"worse.\n");
return 0;
}
static void print_codecs(int encoder)
{
const AVCodecDescriptor *desc = NULL;
printf("%s:\n"
" V..... = Video\n"
" A..... = Audio\n"
" S..... = Subtitle\n"
" .F.... = Frame-level multithreading\n"
" ..S... = Slice-level multithreading\n"
" ...X.. = Codec is experimental\n"
" ....B. = Supports draw_horiz_band\n"
" .....D = Supports direct rendering method 1\n"
" ------\n",
encoder ? "Encoders" : "Decoders");
while ((desc = avcodec_descriptor_next(desc))) {
const AVCodec *codec = NULL;
while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
printf("%c", get_media_type_char(desc->type));
printf((codec->capabilities & CODEC_CAP_FRAME_THREADS) ? "F" : ".");
printf((codec->capabilities & CODEC_CAP_SLICE_THREADS) ? "S" : ".");
printf((codec->capabilities & CODEC_CAP_EXPERIMENTAL) ? "X" : ".");
printf((codec->capabilities & CODEC_CAP_DRAW_HORIZ_BAND)?"B" : ".");
printf((codec->capabilities & CODEC_CAP_DR1) ? "D" : ".");
printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : "");
if (strcmp(codec->name, desc->name))
printf(" (codec %s)", desc->name);
printf("\n");
}
}
}
int show_decoders(const char *opt, const char *arg)
{
print_codecs(0);
return 0;
}
int show_encoders(const char *opt, const char *arg)
{
print_codecs(1);
return 0;
}

@ -298,7 +298,19 @@ int opt_formats(const char *opt, const char *arg);
* program.
* This option processing function does not utilize the arguments.
*/
int opt_codecs(const char *opt, const char *arg);
int show_codecs(const char *opt, const char *arg);
/**
* Print a listing containing all the decoders supported by the
* program.
*/
int show_decoders(const char *opt, const char *arg);
/**
* Print a listing containing all the encoders supported by the
* program.
*/
int show_encoders(const char *opt, const char *arg);
/**
* Print a listing containing all the filters supported by the

@ -5,7 +5,9 @@
{ "-help", OPT_EXIT, {(void*)opt_help}, "show help" },
{ "version", OPT_EXIT, {(void*)opt_version}, "show version" },
{ "formats" , OPT_EXIT, {(void*)opt_formats }, "show available formats" },
{ "codecs" , OPT_EXIT, {(void*)opt_codecs }, "show available codecs" },
{ "codecs" , OPT_EXIT, {(void*)show_codecs }, "show available codecs" },
{ "decoders" , OPT_EXIT, {(void*)show_decoders }, "show available decoders" },
{ "encoders" , OPT_EXIT, {(void*)show_encoders }, "show available encoders" },
{ "bsfs" , OPT_EXIT, {(void*)opt_bsfs }, "show available bit stream filters" },
{ "protocols", OPT_EXIT, {(void*)opt_protocols}, "show available protocols" },
{ "filters", OPT_EXIT, {(void*)opt_filters }, "show available filters" },

@ -72,23 +72,16 @@ Encoding available
@end table
@item -codecs
Show available codecs.
Show all codecs known to libavcodec.
The fields preceding the codec names have the following meanings:
@table @samp
@item D
Decoding available
@item E
Encoding available
@item V/A/S
Video/audio/subtitle codec
@item S
Codec supports slices
@item D
Codec supports direct rendering
@item T
Codec can handle input truncated at random locations instead of only at frame boundaries
@end table
Note that the term 'codec' is used throughout this documentation as a shortcut
for what is more correctly called a media bitstream format.
@item -decoders
Show available decoders.
@item -encoders
Show all available encoders.
@item -bsfs
Show available bitstream filters.

@ -928,7 +928,7 @@ Try to make the choice automatically, in order to generate a sane output.
Default value is -1.
@item -shortest
@item -shortest (@emph{output})
Finish encoding when the shortest input stream ends.
@item -dts_delta_threshold
Timestamp discontinuity delta threshold.

@ -2783,10 +2783,20 @@ static int process_input(void)
poll_filters();
}
if (opt_shortest)
return AVERROR_EOF;
else
return AVERROR(EAGAIN);
for (i = 0; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i];
OutputFile *of = output_files[ost->file_index];
AVFormatContext *os = output_files[ost->file_index]->ctx;
if (of->shortest) {
int j;
for (j = 0; j < of->ctx->nb_streams; j++)
output_streams[of->ost_index + j]->finished = 1;
continue;
}
}
return AVERROR(EAGAIN);
}
reset_eagain();

@ -114,6 +114,7 @@ typedef struct OptionsContext {
uint64_t limit_filesize;
float mux_preload;
float mux_max_delay;
int shortest;
int video_disable;
int audio_disable;
@ -332,6 +333,8 @@ typedef struct OutputFile {
int64_t recording_time; ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
uint64_t limit_filesize; /* filesize limit expressed in bytes */
int shortest;
} OutputFile;
extern InputStream **input_streams;
@ -365,7 +368,6 @@ extern int do_pkt_dump;
extern int copy_ts;
extern int copy_tb;
extern int debug_ts;
extern int opt_shortest;
extern int exit_on_error;
extern int print_stats;
extern int qp_hist;

@ -1613,6 +1613,7 @@ loop_end:
oc->duration = o->recording_time;
output_files[nb_output_files - 1]->start_time = o->start_time;
output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
output_files[nb_output_files - 1]->shortest = o->shortest;
av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
/* check filename in case of an image number is expected */
@ -2210,7 +2211,7 @@ const OptionDef options[] = {
{ "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
{ "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
{ "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying", "mode" },
{ "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
{ "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(shortest)}, "finish encoding within shortest input" },
{ "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
{ "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
{ "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },

@ -133,7 +133,7 @@ static int decode_mime_header(AMRWBContext *ctx, const uint8_t *buf)
{
/* Decode frame header (1st octet) */
ctx->fr_cur_mode = buf[0] >> 3 & 0x0F;
ctx->fr_quality = (buf[0] & 0x4) != 0x4;
ctx->fr_quality = (buf[0] & 0x4) == 0x4;
return 1;
}

@ -1440,7 +1440,7 @@ typedef struct AVCodecContext {
int log_level_offset;
enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
struct AVCodec *codec;
const struct AVCodec *codec;
char codec_name[32];
enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
@ -3338,7 +3338,7 @@ typedef struct AVSubtitle {
* if c is non-NULL, returns the next registered codec after c,
* or NULL if c is the last one.
*/
AVCodec *av_codec_next(AVCodec *c);
AVCodec *av_codec_next(const AVCodec *c);
/**
* Return the LIBAVCODEC_VERSION_INT constant.
@ -3426,7 +3426,7 @@ void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType);
* @return An AVCodecContext filled with default values or NULL on failure.
* @see avcodec_get_context_defaults
*/
AVCodecContext *avcodec_alloc_context3(AVCodec *codec);
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
/**
* Set the fields of the given AVCodecContext to default values corresponding
@ -3437,7 +3437,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec);
* If codec is non-NULL, it is illegal to call avcodec_open2() with a
* different codec on this AVCodecContext.
*/
int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec);
int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec);
/**
* Get the AVClass for AVCodecContext. It can be used in combination with
@ -3562,7 +3562,7 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
* @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
* av_dict_set(), av_opt_find().
*/
int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options);
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
/**
* Close a given AVCodecContext and free all the data associated with it
@ -4834,12 +4834,12 @@ int avcodec_is_open(AVCodecContext *s);
/**
* @return a non-zero number if codec is an encoder, zero otherwise
*/
int av_codec_is_encoder(AVCodec *codec);
int av_codec_is_encoder(const AVCodec *codec);
/**
* @return a non-zero number if codec is a decoder, zero otherwise
*/
int av_codec_is_decoder(AVCodec *codec);
int av_codec_is_decoder(const AVCodec *codec);
/**
* @return descriptor for given codec ID or NULL if no descriptor exists.
@ -4855,6 +4855,12 @@ const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
*/
const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
/**
* @return codec descriptor with the given name or NULL if no such descriptor
* exists.
*/
const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
/**
* @}
*/

@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <string.h>
#include "avcodec.h"
#include "libavutil/common.h"
@ -2122,3 +2124,14 @@ const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev)
return prev + 1;
return NULL;
}
const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name)
{
const AVCodecDescriptor *desc = NULL;
while ((desc = avcodec_descriptor_next(desc))) {
if (!strcmp(desc->name, name))
return desc;
}
return NULL;
}

@ -1120,6 +1120,22 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
return 0;
}
static int encode_frame(AVCodecContext *c, AVFrame *frame)
{
AVPacket pkt = { 0 };
int ret, got_output;
av_init_packet(&pkt);
av_init_packet(&pkt);
ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
if (ret < 0)
return ret;
ret = pkt.size;
av_free_packet(&pkt);
return ret;
}
static int estimate_best_b_count(MpegEncContext *s)
{
AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
@ -1127,8 +1143,6 @@ static int estimate_best_b_count(MpegEncContext *s)
AVFrame input[FF_MAX_B_FRAMES + 2];
const int scale = s->avctx->brd_scale;
int i, j, out_size, p_lambda, b_lambda, lambda2;
int outbuf_size = s->width * s->height; // FIXME
uint8_t *outbuf = av_malloc(outbuf_size);
int64_t best_rd = INT64_MAX;
int best_b_count = -1;
@ -1205,8 +1219,9 @@ static int estimate_best_b_count(MpegEncContext *s)
input[0].pict_type = AV_PICTURE_TYPE_I;
input[0].quality = 1 * FF_QP2LAMBDA;
out_size = avcodec_encode_video(c, outbuf,
outbuf_size, &input[0]);
out_size = encode_frame(c, &input[0]);
//rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
for (i = 0; i < s->max_b_frames + 1; i++) {
@ -1215,14 +1230,15 @@ static int estimate_best_b_count(MpegEncContext *s)
input[i + 1].pict_type = is_p ?
AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
input[i + 1].quality = is_p ? p_lambda : b_lambda;
out_size = avcodec_encode_video(c, outbuf, outbuf_size,
&input[i + 1]);
out_size = encode_frame(c, &input[i + 1]);
rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
}
/* get the delayed frames */
while (out_size) {
out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
out_size = encode_frame(c, NULL);
rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
}
@ -1234,7 +1250,6 @@ static int estimate_best_b_count(MpegEncContext *s)
}
}
av_freep(&outbuf);
avcodec_close(c);
av_freep(&c);

@ -94,7 +94,8 @@ void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType codec_typ
}
#endif
int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec){
int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec)
{
int flags=0;
memset(s, 0, sizeof(AVCodecContext));
@ -146,7 +147,8 @@ int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec){
return 0;
}
AVCodecContext *avcodec_alloc_context3(AVCodec *codec){
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
{
AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
if(avctx==NULL) return NULL;

@ -115,7 +115,8 @@ void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
/* encoder management */
static AVCodec *first_avcodec = NULL;
AVCodec *av_codec_next(AVCodec *c){
AVCodec *av_codec_next(const AVCodec *c)
{
if(c) return c->next;
else return first_avcodec;
}
@ -131,12 +132,12 @@ static void avcodec_init(void)
ff_dsputil_static_init();
}
int av_codec_is_encoder(AVCodec *codec)
int av_codec_is_encoder(const AVCodec *codec)
{
return codec && (codec->encode || codec->encode2);
}
int av_codec_is_decoder(AVCodec *codec)
int av_codec_is_decoder(const AVCodec *codec)
{
return codec && codec->decode;
}
@ -750,7 +751,7 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
}
#endif
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
{
int ret = 0;
AVDictionary *tmp = NULL;
@ -1888,7 +1889,7 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
const char *codec_type;
const char *codec_name;
const char *profile = NULL;
AVCodec *p;
const AVCodec *p;
int bitrate;
AVRational display_aspect_ratio;

@ -382,6 +382,21 @@ int ffurl_get_file_handle(URLContext *h)
return h->prot->url_get_file_handle(h);
}
int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
{
if (!h->prot->url_get_multi_file_handle) {
if (!h->prot->url_get_file_handle)
return AVERROR(ENOSYS);
*handles = av_malloc(sizeof(*handles));
if (!*handles)
return AVERROR(ENOMEM);
*numhandles = 1;
*handles[0] = h->prot->url_get_file_handle(h);
return 0;
}
return h->prot->url_get_multi_file_handle(h, handles, numhandles);
}
int ffurl_shutdown(URLContext *h, int flags)
{
if (!h->prot->url_shutdown)

@ -41,6 +41,8 @@
#include "libavutil/opt.h"
#include "libavutil/timecode.h"
#define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
struct DVMuxContext {
AVClass *av_class;
const DVprofile* sys; /* current DV profile, e.g.: 525/60, 625/50 */
@ -241,7 +243,7 @@ static int dv_assemble_frame(DVMuxContext *c, AVStream* st,
for (i = 0; i < c->n_ast && st != c->ast[i]; i++);
/* FIXME: we have to have more sensible approach than this one */
if (av_fifo_size(c->audio_data[i]) + data_size >= 100*AVCODEC_MAX_AUDIO_FRAME_SIZE)
if (av_fifo_size(c->audio_data[i]) + data_size >= 100*MAX_AUDIO_FRAME_SIZE)
av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames);
av_fifo_generic_write(c->audio_data[i], data, data_size, NULL);
@ -329,7 +331,7 @@ static DVMuxContext* dv_init_mux(AVFormatContext* s)
c->start_time = ff_iso8601_to_unix_time(t->value);
for (i=0; i < c->n_ast; i++) {
if (c->ast[i] && !(c->audio_data[i]=av_fifo_alloc(100*AVCODEC_MAX_AUDIO_FRAME_SIZE))) {
if (c->ast[i] && !(c->audio_data[i]=av_fifo_alloc(100*MAX_AUDIO_FRAME_SIZE))) {
while (i > 0) {
i--;
av_fifo_free(c->audio_data[i]);

@ -28,6 +28,7 @@
#include "config.h"
#include "rtmpdh.h"
#include "libavutil/random_seed.h"
#define P1024 \
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \
@ -78,7 +79,14 @@
ret = (mpz_set_str(bn, buf, 16) == 0); \
} while (0)
#define bn_modexp(bn, y, q, p) mpz_powm(bn, y, q, p)
#define bn_random(bn, num_bytes) mpz_random(bn, num_bytes);
#define bn_random(bn, num_bytes) \
do { \
gmp_randstate_t rs; \
gmp_randinit_mt(rs); \
gmp_randseed_ui(rs, av_get_random_seed()); \
mpz_urandomb(bn, rs, num_bytes); \
gmp_randclear(rs); \
} while (0)
#elif CONFIG_GCRYPT
#define bn_new(bn) bn = gcry_mpi_new(1)
#define bn_free(bn) gcry_mpi_release(bn)

@ -71,11 +71,6 @@ void ff_rtp_send_punch_packets(URLContext* rtp_handle);
*/
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, int count);
/**
* Get the file handle for the RTCP socket.
*/
int ff_rtp_get_rtcp_file_handle(URLContext *h);
// these statistics are used for rtcp receiver reports...
typedef struct {
uint16_t max_seq; ///< highest sequence number seen

@ -316,18 +316,27 @@ static int rtp_get_file_handle(URLContext *h)
return s->rtp_fd;
}
int ff_rtp_get_rtcp_file_handle(URLContext *h) {
static int rtp_get_multi_file_handle(URLContext *h, int **handles,
int *numhandles)
{
RTPContext *s = h->priv_data;
return s->rtcp_fd;
int *hs = *handles = av_malloc(sizeof(**handles) * 2);
if (!hs)
return AVERROR(ENOMEM);
hs[0] = s->rtp_fd;
hs[1] = s->rtcp_fd;
*numhandles = 2;
return 0;
}
URLProtocol ff_rtp_protocol = {
.name = "rtp",
.url_open = rtp_open,
.url_read = rtp_read,
.url_write = rtp_write,
.url_close = rtp_close,
.url_get_file_handle = rtp_get_file_handle,
.priv_data_size = sizeof(RTPContext),
.flags = URL_PROTOCOL_FLAG_NETWORK,
.name = "rtp",
.url_open = rtp_open,
.url_read = rtp_read,
.url_write = rtp_write,
.url_close = rtp_close,
.url_get_file_handle = rtp_get_file_handle,
.url_get_multi_file_handle = rtp_get_multi_file_handle,
.priv_data_size = sizeof(RTPContext),
.flags = URL_PROTOCOL_FLAG_NETWORK,
};

@ -1690,6 +1690,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
int n, i, ret, tcp_fd, timeout_cnt = 0;
int max_p = 0;
struct pollfd *p = rt->p;
int *fds = NULL, fdsnum, fdsidx;
for (;;) {
if (ff_check_interrupt(&s->interrupt_callback))
@ -1707,10 +1708,21 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
for (i = 0; i < rt->nb_rtsp_streams; i++) {
rtsp_st = rt->rtsp_streams[i];
if (rtsp_st->rtp_handle) {
p[max_p].fd = ffurl_get_file_handle(rtsp_st->rtp_handle);
p[max_p++].events = POLLIN;
p[max_p].fd = ff_rtp_get_rtcp_file_handle(rtsp_st->rtp_handle);
p[max_p++].events = POLLIN;
if (ret = ffurl_get_multi_file_handle(rtsp_st->rtp_handle,
&fds, &fdsnum)) {
av_log(s, AV_LOG_ERROR, "Unable to recover rtp ports\n");
return ret;
}
if (fdsnum != 2) {
av_log(s, AV_LOG_ERROR,
"Number of fds %d not supported\n", fdsnum);
return AVERROR_INVALIDDATA;
}
for (fdsidx = 0; fdsidx < fdsnum; fdsidx++) {
p[max_p].fd = fds[fdsidx];
p[max_p++].events = POLLIN;
}
av_free(fds);
}
}
n = poll(p, max_p, POLL_TIMEOUT_MS);

@ -23,7 +23,7 @@
#include "internal.h"
const AVCodecTag ff_swf_codec_tags[] = {
{ CODEC_ID_FLV1, 0x02 },
{ CODEC_ID_VP6F, 0x04 },
{ CODEC_ID_NONE, 0 },
{ AV_CODEC_ID_FLV1, 0x02 },
{ AV_CODEC_ID_VP6F, 0x04 },
{ AV_CODEC_ID_NONE, 0 },
};

@ -24,12 +24,12 @@
#include "swf.h"
static const AVCodecTag swf_audio_codec_tags[] = {
{ CODEC_ID_PCM_S16LE, 0x00 },
{ CODEC_ID_ADPCM_SWF, 0x01 },
{ CODEC_ID_MP3, 0x02 },
{ CODEC_ID_PCM_S16LE, 0x03 },
// { CODEC_ID_NELLYMOSER, 0x06 },
{ CODEC_ID_NONE, 0 },
{ AV_CODEC_ID_PCM_S16LE, 0x00 },
{ AV_CODEC_ID_ADPCM_SWF, 0x01 },
{ AV_CODEC_ID_MP3, 0x02 },
{ AV_CODEC_ID_PCM_S16LE, 0x03 },
// { AV_CODEC_ID_NELLYMOSER, 0x06 },
{ AV_CODEC_ID_NONE, 0 },
};
static int get_swf_tag(AVIOContext *pb, int *len_ptr)

@ -81,6 +81,8 @@ typedef struct URLProtocol {
int64_t (*url_read_seek)(URLContext *h, int stream_index,
int64_t timestamp, int flags);
int (*url_get_file_handle)(URLContext *h);
int (*url_get_multi_file_handle)(URLContext *h, int **handles,
int *numhandles);
int (*url_shutdown)(URLContext *h, int flags);
int priv_data_size;
const AVClass *priv_data_class;
@ -202,6 +204,13 @@ int64_t ffurl_size(URLContext *h);
*/
int ffurl_get_file_handle(URLContext *h);
/**
* Return the file descriptors associated with this URL.
*
* @return 0 on success or <0 on error.
*/
int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
/**
* Signal the URLContext that we are done reading or writing the stream.
*

Loading…
Cancel
Save