* 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>tags/n1.0
@@ -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*)©_ts}, "copy timestamps" }, | |||
{ "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_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. | |||
* | |||