mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-27 18:02:11 +00:00
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>
This commit is contained in:
commit
6c180b35c4
@ -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:
|
||||
|
187
cmdutils.c
187
cmdutils.c
@ -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;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
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"
|
||||
" ...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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
14
cmdutils.h
14
cmdutils.h
@ -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.
|
||||
|
18
ffmpeg.c
18
ffmpeg.c
@ -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();
|
||||
|
4
ffmpeg.h
4
ffmpeg.h
@ -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.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user