You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02: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:
		| @@ -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. | ||||
|  * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user