mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: APIchanges: fill in missing hashes and dates. Add an APIChanges entry and bump minor versions for recent changes. ffmpeg: print the low bitrate warning after the codec is openend. doxygen: Move function documentation into the macro generating the function. doxygen: Make sure parameter names match between .c and .h files. h264: move fill_decode_neighbors()/fill_decode_caches() to h264_mvpred.h H.264: Add more x86 assembly for 10-bit H.264 predict functions lavf: fix invalid reads in avformat_find_stream_info() cmdutils: replace opt_default with opt_default2() and remove set_context_opts ffmpeg: use new avcodec_open2 and avformat_find_stream_info API. ffplay: use new avcodec_open2 and avformat_find_stream_info API. cmdutils: store all codec options in one dict instead of video/audio/sub ffmpeg: check experimental flag after codec is opened. ffmpeg: do not set GLOBAL_HEADER flag in the options context Conflicts: cmdutils.c doc/APIchanges ffmpeg.c ffplay.c libavcodec/version.h libavformat/version.h libswscale/swscale_unscaled.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
5dc6bd86f0
3
Doxyfile
3
Doxyfile
@ -1382,7 +1382,8 @@ PREDEFINED = "__attribute__(x)=" \
|
||||
# The macro definition that is found in the sources will be used.
|
||||
# Use the PREDEFINED tag if you want to use a different macro definition.
|
||||
|
||||
EXPAND_AS_DEFINED = declare_idct
|
||||
EXPAND_AS_DEFINED = declare_idct \
|
||||
READ_PAR_DATA \
|
||||
|
||||
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
|
||||
# doxygen's preprocessor will remove all function-like macros that are alone
|
||||
|
205
cmdutils.c
205
cmdutils.c
@ -49,13 +49,10 @@
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
|
||||
const char **opt_names;
|
||||
const char **opt_values;
|
||||
static int opt_name_count;
|
||||
AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
|
||||
AVFormatContext *avformat_opts;
|
||||
struct SwsContext *sws_opts;
|
||||
AVDictionary *format_opts, *video_opts, *audio_opts, *sub_opts;
|
||||
AVDictionary *format_opts, *codec_opts;
|
||||
|
||||
static const int this_year = 2011;
|
||||
|
||||
@ -81,17 +78,8 @@ void uninit_opts(void)
|
||||
sws_freeContext(sws_opts);
|
||||
sws_opts = NULL;
|
||||
#endif
|
||||
for (i = 0; i < opt_name_count; i++) {
|
||||
av_freep(&opt_names[i]);
|
||||
av_freep(&opt_values[i]);
|
||||
}
|
||||
av_freep(&opt_names);
|
||||
av_freep(&opt_values);
|
||||
opt_name_count = 0;
|
||||
av_dict_free(&format_opts);
|
||||
av_dict_free(&video_opts);
|
||||
av_dict_free(&audio_opts);
|
||||
av_dict_free(&sub_opts);
|
||||
av_dict_free(&codec_opts);
|
||||
}
|
||||
|
||||
void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
|
||||
@ -297,20 +285,14 @@ unknown_opt:
|
||||
}
|
||||
|
||||
#define FLAGS (o->type == FF_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
|
||||
#define SET_PREFIXED_OPTS(ch, flag, output) \
|
||||
if (opt[0] == ch && avcodec_opts[0] && (o = av_opt_find(avcodec_opts[0], opt+1, NULL, flag, 0)))\
|
||||
av_dict_set(&output, opt+1, arg, FLAGS);
|
||||
static int opt_default2(const char *opt, const char *arg)
|
||||
int opt_default(const char *opt, const char *arg)
|
||||
{
|
||||
const AVOption *o;
|
||||
if ((o = av_opt_find(avcodec_opts[0], opt, NULL, 0, AV_OPT_SEARCH_CHILDREN))) {
|
||||
if (o->flags & AV_OPT_FLAG_VIDEO_PARAM)
|
||||
av_dict_set(&video_opts, opt, arg, FLAGS);
|
||||
if (o->flags & AV_OPT_FLAG_AUDIO_PARAM)
|
||||
av_dict_set(&audio_opts, opt, arg, FLAGS);
|
||||
if (o->flags & AV_OPT_FLAG_SUBTITLE_PARAM)
|
||||
av_dict_set(&sub_opts, opt, arg, FLAGS);
|
||||
} else if ((o = av_opt_find(avformat_opts, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN)))
|
||||
if ((o = av_opt_find(avcodec_opts[0], opt, NULL, 0, AV_OPT_SEARCH_CHILDREN)) ||
|
||||
((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
|
||||
(o = av_opt_find(avcodec_opts[0], opt+1, NULL, 0, 0))))
|
||||
av_dict_set(&codec_opts, opt, arg, FLAGS);
|
||||
else if ((o = av_opt_find(avformat_opts, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN)))
|
||||
av_dict_set(&format_opts, opt, arg, FLAGS);
|
||||
else if ((o = av_opt_find(sws_opts, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN))) {
|
||||
// XXX we only support sws_flags, not arbitrary sws options
|
||||
@ -321,18 +303,13 @@ static int opt_default2(const char *opt, const char *arg)
|
||||
}
|
||||
}
|
||||
|
||||
if (!o) {
|
||||
SET_PREFIXED_OPTS('v', AV_OPT_FLAG_VIDEO_PARAM, video_opts)
|
||||
SET_PREFIXED_OPTS('a', AV_OPT_FLAG_AUDIO_PARAM, audio_opts)
|
||||
SET_PREFIXED_OPTS('s', AV_OPT_FLAG_SUBTITLE_PARAM, sub_opts)
|
||||
}
|
||||
|
||||
if (o)
|
||||
return 0;
|
||||
fprintf(stderr, "Unrecognized option '%s'\n", opt);
|
||||
return AVERROR_OPTION_NOT_FOUND;
|
||||
}
|
||||
|
||||
#if 0
|
||||
<<<<<<< HEAD
|
||||
int opt_default(const char *opt, const char *arg){
|
||||
int type;
|
||||
int ret= 0;
|
||||
@ -408,6 +385,70 @@ int opt_default(const char *opt, const char *arg){
|
||||
return 0;
|
||||
}
|
||||
|
||||
||||||| merged common ancestors
|
||||
int opt_default(const char *opt, const char *arg){
|
||||
int type;
|
||||
int ret= 0;
|
||||
const AVOption *o= NULL;
|
||||
int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
|
||||
|
||||
for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
|
||||
const AVOption *o2 = av_opt_find(avcodec_opts[0], opt, NULL, opt_types[type], 0);
|
||||
if(o2)
|
||||
ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
|
||||
}
|
||||
if(!o && avformat_opts)
|
||||
ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
|
||||
if(!o && sws_opts)
|
||||
ret = av_set_string3(sws_opts, opt, arg, 1, &o);
|
||||
if(!o){
|
||||
if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
|
||||
ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
|
||||
else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
|
||||
ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
|
||||
else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
|
||||
ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
|
||||
}
|
||||
if (o && ret < 0) {
|
||||
fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
|
||||
exit(1);
|
||||
}
|
||||
if (!o) {
|
||||
AVCodec *p = NULL;
|
||||
AVOutputFormat *oformat = NULL;
|
||||
while ((p=av_codec_next(p))){
|
||||
const AVClass *c = p->priv_class;
|
||||
if(c && av_opt_find(&c, opt, NULL, 0, 0))
|
||||
break;
|
||||
}
|
||||
if (!p) {
|
||||
while ((oformat = av_oformat_next(oformat))) {
|
||||
const AVClass *c = oformat->priv_class;
|
||||
if (c && av_opt_find(&c, opt, NULL, 0, 0))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret = opt_default2(opt, arg)) < 0)
|
||||
return ret;
|
||||
|
||||
// av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avcodec_opts, opt, NULL), (int)av_get_int(avcodec_opts, opt, NULL));
|
||||
|
||||
//FIXME we should always use avcodec_opts, ... for storing options so there will not be any need to keep track of what i set over this
|
||||
opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
|
||||
opt_values[opt_name_count]= o ? NULL : av_strdup(arg);
|
||||
opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
|
||||
opt_names[opt_name_count++]= o ? o->name : av_strdup(opt);
|
||||
|
||||
if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
|
||||
av_log_set_level(AV_LOG_DEBUG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
=======
|
||||
>>>>>>> qatar/master
|
||||
#endif
|
||||
int opt_loglevel(const char *opt, const char *arg)
|
||||
{
|
||||
const struct { const char *name; int level; } log_levels[] = {
|
||||
@ -456,59 +497,6 @@ int opt_timelimit(const char *opt, const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *alloc_priv_context(int size, const AVClass *class)
|
||||
{
|
||||
void *p = av_mallocz(size);
|
||||
if (p) {
|
||||
*(const AVClass **)p = class;
|
||||
av_opt_set_defaults(p);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
|
||||
{
|
||||
int i;
|
||||
void *priv_ctx=NULL;
|
||||
if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
|
||||
AVCodecContext *avctx= ctx;
|
||||
if(codec && codec->priv_class){
|
||||
if(!avctx->priv_data && codec->priv_data_size)
|
||||
avctx->priv_data= alloc_priv_context(codec->priv_data_size, codec->priv_class);
|
||||
priv_ctx= avctx->priv_data;
|
||||
}
|
||||
} else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
|
||||
AVFormatContext *avctx = ctx;
|
||||
if (avctx->oformat && avctx->oformat->priv_class) {
|
||||
priv_ctx = avctx->priv_data;
|
||||
} else if (avctx->iformat && avctx->iformat->priv_class) {
|
||||
priv_ctx = avctx->priv_data;
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0; i<opt_name_count; i++){
|
||||
char buf[256];
|
||||
const AVOption *opt;
|
||||
const char *str;
|
||||
if (priv_ctx) {
|
||||
if (av_find_opt(priv_ctx, opt_names[i], NULL, flags, flags)) {
|
||||
if (av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL) < 0) {
|
||||
fprintf(stderr, "Invalid value '%s' for option '%s'\n",
|
||||
opt_values[i], opt_names[i]);
|
||||
exit(1);
|
||||
}
|
||||
} else
|
||||
goto global;
|
||||
} else {
|
||||
global:
|
||||
str = av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
|
||||
/* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
|
||||
if (str && ((opt->flags & flags) == flags))
|
||||
av_set_string3(ctx, opt_names[i], str, 1, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void print_error(const char *filename, int err)
|
||||
{
|
||||
char errbuf[128];
|
||||
@ -934,3 +922,48 @@ FILE *get_preset_file(char *filename, size_t filename_size,
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, int encoder)
|
||||
{
|
||||
AVDictionary *ret = NULL;
|
||||
AVDictionaryEntry *t = NULL;
|
||||
AVCodec *codec = encoder ? avcodec_find_encoder(codec_id) : avcodec_find_decoder(codec_id);
|
||||
int flags = encoder ? AV_OPT_FLAG_ENCODING_PARAM : AV_OPT_FLAG_DECODING_PARAM;
|
||||
char prefix = 0;
|
||||
|
||||
if (!codec)
|
||||
return NULL;
|
||||
|
||||
switch (codec->type) {
|
||||
case AVMEDIA_TYPE_VIDEO: prefix = 'v'; flags |= AV_OPT_FLAG_VIDEO_PARAM; break;
|
||||
case AVMEDIA_TYPE_AUDIO: prefix = 'a'; flags |= AV_OPT_FLAG_AUDIO_PARAM; break;
|
||||
case AVMEDIA_TYPE_SUBTITLE: prefix = 's'; flags |= AV_OPT_FLAG_SUBTITLE_PARAM; break;
|
||||
}
|
||||
|
||||
while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
|
||||
if (av_opt_find(avcodec_opts[0], t->key, NULL, flags, 0) ||
|
||||
(codec && codec->priv_class && av_opt_find(&codec->priv_class, t->key, NULL, flags, 0)))
|
||||
av_dict_set(&ret, t->key, t->value, 0);
|
||||
else if (t->key[0] == prefix && av_opt_find(avcodec_opts[0], t->key+1, NULL, flags, 0))
|
||||
av_dict_set(&ret, t->key+1, t->value, 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
AVDictionary **setup_find_stream_info_opts(AVFormatContext *s)
|
||||
{
|
||||
int i;
|
||||
AVDictionary **opts;
|
||||
|
||||
if (!s->nb_streams)
|
||||
return NULL;
|
||||
opts = av_mallocz(s->nb_streams * sizeof(*opts));
|
||||
if (!opts) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Could not alloc memory for stream options.\n");
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < s->nb_streams; i++)
|
||||
opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id, 0);
|
||||
return opts;
|
||||
}
|
||||
|
||||
|
13
cmdutils.h
13
cmdutils.h
@ -43,11 +43,10 @@ extern const char program_name[];
|
||||
*/
|
||||
extern const int program_birth_year;
|
||||
|
||||
extern const char **opt_names;
|
||||
extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
|
||||
extern AVFormatContext *avformat_opts;
|
||||
extern struct SwsContext *sws_opts;
|
||||
extern AVDictionary *format_opts, *video_opts, *audio_opts, *sub_opts;
|
||||
extern AVDictionary *format_opts, *codec_opts;
|
||||
|
||||
/**
|
||||
* Initialize the cmdutils option system, in particular
|
||||
@ -153,7 +152,15 @@ void show_help_options(const OptionDef *options, const char *msg, int mask, int
|
||||
void parse_options(int argc, char **argv, const OptionDef *options,
|
||||
int (* parse_arg_function)(const char *opt, const char *arg));
|
||||
|
||||
void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec);
|
||||
/**
|
||||
* Filter out options for given codec.
|
||||
*/
|
||||
AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, int encoder);
|
||||
|
||||
/*
|
||||
* Setup AVCodecContext options for avformat_find_stream_info.
|
||||
*/
|
||||
AVDictionary **setup_find_stream_info_opts(AVFormatContext *s);
|
||||
|
||||
/**
|
||||
* Print an error message to stderr, indicating filename and a human
|
||||
|
@ -13,6 +13,12 @@ libavutil: 2011-04-18
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2011-07-10 - a67c061 - lavf 53.3.0
|
||||
Add avformat_find_stream_info(), deprecate av_find_stream_info().
|
||||
|
||||
2011-07-10 - 0b950fe - lavc 53.6.0
|
||||
Add avcodec_open2(), deprecate avcodec_open().
|
||||
|
||||
2011-07-01 - b442ca6 - lavf 53.5.0 - avformat.h
|
||||
Add function av_get_output_timestamp().
|
||||
|
||||
@ -49,20 +55,20 @@ API changes, most recent first:
|
||||
2011-06-12 - xxxxxxx - lavfi 2.16.0 - avfilter_graph_parse()
|
||||
Change avfilter_graph_parse() signature.
|
||||
|
||||
2011-06-xx - xxxxxxx - lavu 51.8.0 - attributes.h
|
||||
2011-06-23 - 67e9ae1 - lavu 51.8.0 - attributes.h
|
||||
Add av_printf_format().
|
||||
|
||||
2011-06-xx - xxxxxxx - lavf 53.2.0 - avformat.h
|
||||
2011-06-16 - 05e84c9, 25de595 - lavf 53.2.0 - avformat.h
|
||||
Add avformat_open_input and avformat_write_header().
|
||||
Deprecate av_open_input_stream, av_open_input_file,
|
||||
AVFormatParameters and av_write_header.
|
||||
|
||||
2011-06-xx - xxxxxxx - lavu 51.7.0 - opt.h
|
||||
2011-06-16 - 7e83e1c, dc59ec5 - lavu 51.7.0 - opt.h
|
||||
Add av_opt_set_dict() and av_opt_find().
|
||||
Deprecate av_find_opt().
|
||||
Add AV_DICT_APPEND flag.
|
||||
|
||||
2011-06-xx - xxxxxxx - lavu 51.6.0 - opt.h
|
||||
2011-06-10 - cb7c11c - lavu 51.6.0 - opt.h
|
||||
Add av_opt_flag_is_set().
|
||||
|
||||
2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays
|
||||
|
@ -159,8 +159,6 @@ Set the ISO 639 language code (3 letters) of the current subtitle stream.
|
||||
@section Video Options
|
||||
|
||||
@table @option
|
||||
@item -b @var{bitrate}
|
||||
Set the video bitrate in bit/s (default = 200 kb/s).
|
||||
@item -vframes @var{number}
|
||||
Set the number of video frames to record.
|
||||
@item -r @var{fps}
|
||||
@ -560,8 +558,6 @@ Set the audio sampling frequency. For output streams it is set by
|
||||
default to the frequency of the corresponding input stream. For input
|
||||
streams this option only makes sense for audio grabbing devices and raw
|
||||
demuxers and is mapped to the corresponding demuxer options.
|
||||
@item -ab @var{bitrate}
|
||||
Set the audio bitrate in bit/s (default = 64k).
|
||||
@item -aq @var{q}
|
||||
Set the audio quality (codec-specific, VBR).
|
||||
@item -ac @var{channels}
|
||||
|
106
ffmpeg.c
106
ffmpeg.c
@ -306,6 +306,7 @@ typedef struct OutputStream {
|
||||
#endif
|
||||
|
||||
int sws_flags;
|
||||
AVDictionary *opts;
|
||||
} OutputStream;
|
||||
|
||||
static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
|
||||
@ -326,6 +327,7 @@ typedef struct InputStream {
|
||||
int is_start; /* is 1 at the start and after a discontinuity */
|
||||
int showed_multi_packet_warning;
|
||||
int is_past_recording_time;
|
||||
AVDictionary *opts;
|
||||
} InputStream;
|
||||
|
||||
typedef struct InputFile {
|
||||
@ -536,6 +538,8 @@ static int ffmpeg_exit(int ret)
|
||||
for(i=0;i<nb_input_files;i++) {
|
||||
av_close_input_file(input_files[i].ctx);
|
||||
}
|
||||
for (i = 0; i < nb_input_streams; i++)
|
||||
av_dict_free(&input_streams[i].opts);
|
||||
|
||||
av_free(intra_matrix);
|
||||
av_free(inter_matrix);
|
||||
@ -586,6 +590,23 @@ static void assert_avoptions(AVDictionary *m)
|
||||
}
|
||||
}
|
||||
|
||||
static void assert_codec_experimental(AVCodecContext *c, int encoder)
|
||||
{
|
||||
const char *codec_string = encoder ? "encoder" : "decoder";
|
||||
AVCodec *codec;
|
||||
if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
|
||||
c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
|
||||
av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
|
||||
"results.\nAdd '-strict experimental' if you want to use it.\n",
|
||||
codec_string, c->codec->name);
|
||||
codec = encoder ? avcodec_find_encoder(codec->id) : avcodec_find_decoder(codec->id);
|
||||
if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
|
||||
av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
|
||||
codec_string, codec->name);
|
||||
ffmpeg_exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* similar to ff_dynarray_add() and av_fast_realloc() */
|
||||
static void *grow_array(void *array, int elem_size, int *size, int new_size)
|
||||
{
|
||||
@ -700,6 +721,8 @@ static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, AVCode
|
||||
ost->index = idx;
|
||||
ost->st = st;
|
||||
ost->enc = codec;
|
||||
if (codec)
|
||||
ost->opts = filter_codec_opts(codec_opts, codec->id, 1);
|
||||
|
||||
avcodec_get_context_defaults3(st->codec, codec);
|
||||
|
||||
@ -2410,12 +2433,17 @@ static int transcode(AVFormatContext **output_files,
|
||||
memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
|
||||
ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
|
||||
}
|
||||
if (avcodec_open(ost->st->codec, codec) < 0) {
|
||||
if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
|
||||
snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
|
||||
ost->file_index, ost->index);
|
||||
ret = AVERROR(EINVAL);
|
||||
goto dump_format;
|
||||
}
|
||||
assert_codec_experimental(ost->st->codec, 1);
|
||||
assert_avoptions(ost->opts);
|
||||
if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
|
||||
av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
|
||||
"It takes bits/s as argument, not kbits/s\n");
|
||||
extra_size += ost->st->codec->extradata_size;
|
||||
}
|
||||
}
|
||||
@ -2433,12 +2461,14 @@ static int transcode(AVFormatContext **output_files,
|
||||
ret = AVERROR(EINVAL);
|
||||
goto dump_format;
|
||||
}
|
||||
if (avcodec_open(ist->st->codec, codec) < 0) {
|
||||
if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
|
||||
snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
|
||||
ist->file_index, ist->st->index);
|
||||
ret = AVERROR(EINVAL);
|
||||
goto dump_format;
|
||||
}
|
||||
assert_codec_experimental(ist->st->codec, 0);
|
||||
assert_avoptions(ost->opts);
|
||||
//if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
// ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
|
||||
}
|
||||
@ -2859,6 +2889,7 @@ static int transcode(AVFormatContext **output_files,
|
||||
audio_resample_close(ost->resample);
|
||||
if (ost->reformat_ctx)
|
||||
av_audio_convert_free(ost->reformat_ctx);
|
||||
av_dict_free(&ost->opts);
|
||||
av_free(ost);
|
||||
}
|
||||
}
|
||||
@ -2900,18 +2931,6 @@ static int opt_frame_rate(const char *opt, const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opt_bitrate(const char *opt, const char *arg)
|
||||
{
|
||||
int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
|
||||
|
||||
opt_default(opt, arg);
|
||||
|
||||
if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
|
||||
fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opt_frame_crop(const char *opt, const char *arg)
|
||||
{
|
||||
fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
|
||||
@ -3239,7 +3258,7 @@ static int opt_input_ts_offset(const char *opt, const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
|
||||
static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
|
||||
{
|
||||
const char *codec_string = encoder ? "encoder" : "decoder";
|
||||
AVCodec *codec;
|
||||
@ -3257,19 +3276,6 @@ static enum CodecID find_codec_or_die(const char *name, int type, int encoder, i
|
||||
fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
|
||||
ffmpeg_exit(1);
|
||||
}
|
||||
if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
|
||||
strict > FF_COMPLIANCE_EXPERIMENTAL) {
|
||||
fprintf(stderr, "%s '%s' is experimental and might produce bad "
|
||||
"results.\nAdd '-strict experimental' if you want to use it.\n",
|
||||
codec_string, codec->name);
|
||||
codec = encoder ?
|
||||
avcodec_find_encoder(codec->id) :
|
||||
avcodec_find_decoder(codec->id);
|
||||
if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
|
||||
fprintf(stderr, "Or use the non experimental %s '%s'.\n",
|
||||
codec_string, codec->name);
|
||||
ffmpeg_exit(1);
|
||||
}
|
||||
return codec->id;
|
||||
}
|
||||
|
||||
@ -3280,6 +3286,8 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
int err, i, ret, rfps, rfps_base;
|
||||
int64_t timestamp;
|
||||
uint8_t buf[128];
|
||||
AVDictionary **opts;
|
||||
int orig_nb_streams; // number of streams before avformat_find_stream_info
|
||||
|
||||
if (last_asked_format) {
|
||||
if (!(file_iformat = av_find_input_format(last_asked_format))) {
|
||||
@ -3321,14 +3329,11 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
|
||||
|
||||
ic->video_codec_id =
|
||||
find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
|
||||
avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
|
||||
find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
|
||||
ic->audio_codec_id =
|
||||
find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
|
||||
avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
|
||||
find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
|
||||
ic->subtitle_codec_id=
|
||||
find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
|
||||
avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
|
||||
find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
|
||||
ic->flags |= AVFMT_FLAG_NONBLOCK;
|
||||
|
||||
/* open the input file with generic libav function */
|
||||
@ -3368,9 +3373,13 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
ic->loop_input = loop_input;
|
||||
}
|
||||
|
||||
/* Set AVCodecContext options for avformat_find_stream_info */
|
||||
opts = setup_find_stream_info_opts(ic);
|
||||
orig_nb_streams = ic->nb_streams;
|
||||
|
||||
/* If not enough info to get the stream parameters, we decode the
|
||||
first frames to get it. (used in mpeg case for example) */
|
||||
ret = av_find_stream_info(ic);
|
||||
ret = avformat_find_stream_info(ic, opts);
|
||||
if (ret < 0 && verbose >= 0) {
|
||||
fprintf(stderr, "%s: could not find codec parameters\n", filename);
|
||||
av_close_input_file(ic);
|
||||
@ -3406,6 +3415,7 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
ist->st = st;
|
||||
ist->file_index = nb_input_files;
|
||||
ist->discard = 1;
|
||||
ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, 0);
|
||||
|
||||
if (i < nb_ts_scale)
|
||||
ist->ts_scale = ts_scale[i];
|
||||
@ -3415,7 +3425,6 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
ist->dec = avcodec_find_decoder_by_name(audio_codec_name);
|
||||
if(!ist->dec)
|
||||
ist->dec = avcodec_find_decoder(dec->codec_id);
|
||||
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
|
||||
if(audio_disable)
|
||||
st->discard= AVDISCARD_ALL;
|
||||
break;
|
||||
@ -3423,7 +3432,6 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
ist->dec= avcodec_find_decoder_by_name(video_codec_name);
|
||||
if(!ist->dec)
|
||||
ist->dec = avcodec_find_decoder(dec->codec_id);
|
||||
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
|
||||
rfps = ic->streams[i]->r_frame_rate.num;
|
||||
rfps_base = ic->streams[i]->r_frame_rate.den;
|
||||
if (dec->lowres) {
|
||||
@ -3485,6 +3493,9 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
av_freep(&ts_scale);
|
||||
nb_ts_scale = 0;
|
||||
|
||||
for (i = 0; i < orig_nb_streams; i++)
|
||||
av_dict_free(&opts[i]);
|
||||
av_freep(&opts);
|
||||
av_freep(&video_codec_name);
|
||||
av_freep(&audio_codec_name);
|
||||
av_freep(&subtitle_codec_name);
|
||||
@ -3546,8 +3557,7 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if(!video_stream_copy){
|
||||
if (video_codec_name) {
|
||||
codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
|
||||
avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
|
||||
codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1);
|
||||
codec = avcodec_find_encoder_by_name(video_codec_name);
|
||||
} else {
|
||||
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
|
||||
@ -3578,12 +3588,11 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
||||
video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
|
||||
}
|
||||
|
||||
video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
if (video_stream_copy) {
|
||||
st->stream_copy = 1;
|
||||
video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
video_enc->sample_aspect_ratio =
|
||||
st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
|
||||
} else {
|
||||
@ -3593,7 +3602,6 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
|
||||
if (frame_rate.num)
|
||||
ost->frame_rate = frame_rate;
|
||||
video_enc->codec_id = codec_id;
|
||||
set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
|
||||
|
||||
video_enc->width = frame_width;
|
||||
video_enc->height = frame_height;
|
||||
@ -3681,8 +3689,7 @@ static void new_audio_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if(!audio_stream_copy){
|
||||
if (audio_codec_name) {
|
||||
codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
|
||||
avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
|
||||
codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1);
|
||||
codec = avcodec_find_encoder_by_name(audio_codec_name);
|
||||
} else {
|
||||
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
|
||||
@ -3705,13 +3712,11 @@ static void new_audio_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
||||
audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
|
||||
}
|
||||
if (audio_stream_copy) {
|
||||
st->stream_copy = 1;
|
||||
} else {
|
||||
audio_enc->codec_id = codec_id;
|
||||
set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
|
||||
|
||||
if (audio_qscale > QSCALE_NONE) {
|
||||
audio_enc->flags |= CODEC_FLAG_QSCALE;
|
||||
@ -3756,7 +3761,6 @@ static void new_data_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
||||
data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
}
|
||||
if (data_stream_copy) {
|
||||
st->stream_copy = 1;
|
||||
@ -3777,8 +3781,7 @@ static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if(!subtitle_stream_copy){
|
||||
if (subtitle_codec_name) {
|
||||
codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
|
||||
avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
|
||||
codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1);
|
||||
codec = avcodec_find_encoder_by_name(subtitle_codec_name);
|
||||
} else {
|
||||
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
|
||||
@ -3799,13 +3802,11 @@ static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
|
||||
|
||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
||||
subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
}
|
||||
if (subtitle_stream_copy) {
|
||||
st->stream_copy = 1;
|
||||
} else {
|
||||
subtitle_enc->codec_id = codec_id;
|
||||
set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
|
||||
}
|
||||
|
||||
if (subtitle_language) {
|
||||
@ -4416,8 +4417,6 @@ static const OptionDef options[] = {
|
||||
{ "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
|
||||
|
||||
/* video options */
|
||||
{ "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
|
||||
{ "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
|
||||
{ "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
|
||||
{ "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
|
||||
{ "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
|
||||
@ -4465,7 +4464,6 @@ static const OptionDef options[] = {
|
||||
{ "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
|
||||
|
||||
/* audio options */
|
||||
{ "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
|
||||
{ "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
|
||||
{ "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
|
||||
{ "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
|
||||
|
24
ffplay.c
24
ffplay.c
@ -2111,11 +2111,15 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
AVCodecContext *avctx;
|
||||
AVCodec *codec;
|
||||
SDL_AudioSpec wanted_spec, spec;
|
||||
AVDictionary *opts;
|
||||
AVDictionaryEntry *t = NULL;
|
||||
|
||||
if (stream_index < 0 || stream_index >= ic->nb_streams)
|
||||
return -1;
|
||||
avctx = ic->streams[stream_index]->codec;
|
||||
|
||||
opts = filter_codec_opts(codec_opts, avctx->codec_id, 0);
|
||||
|
||||
/* prepare audio output */
|
||||
if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
if (avctx->channels > 0) {
|
||||
@ -2141,13 +2145,16 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
avctx->error_concealment= error_concealment;
|
||||
avctx->thread_count= thread_count;
|
||||
|
||||
set_context_opts(avctx, avcodec_opts[avctx->codec_type], 0, codec);
|
||||
|
||||
if(codec->capabilities & CODEC_CAP_DR1)
|
||||
avctx->flags |= CODEC_FLAG_EMU_EDGE;
|
||||
|
||||
if (avcodec_open(avctx, codec) < 0)
|
||||
if (!codec ||
|
||||
avcodec_open2(avctx, codec, &opts) < 0)
|
||||
return -1;
|
||||
if ((t = av_dict_get(opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
|
||||
return AVERROR_OPTION_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* prepare audio output */
|
||||
if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
@ -2301,6 +2308,8 @@ static int read_thread(void *arg)
|
||||
int eof=0;
|
||||
int pkt_in_play_range = 0;
|
||||
AVDictionaryEntry *t;
|
||||
AVDictionary **opts;
|
||||
int orig_nb_streams;
|
||||
|
||||
memset(st_index, -1, sizeof(st_index));
|
||||
is->video_stream = -1;
|
||||
@ -2326,12 +2335,19 @@ static int read_thread(void *arg)
|
||||
if(genpts)
|
||||
ic->flags |= AVFMT_FLAG_GENPTS;
|
||||
|
||||
err = av_find_stream_info(ic);
|
||||
opts = setup_find_stream_info_opts(ic);
|
||||
orig_nb_streams = ic->nb_streams;
|
||||
|
||||
err = avformat_find_stream_info(ic, opts);
|
||||
if (err < 0) {
|
||||
fprintf(stderr, "%s: could not find codec parameters\n", is->filename);
|
||||
ret = -1;
|
||||
goto fail;
|
||||
}
|
||||
for (i = 0; i < orig_nb_streams; i++)
|
||||
av_dict_free(&opts[i]);
|
||||
av_freep(&opts);
|
||||
|
||||
if(ic->pb)
|
||||
ic->pb->eof_reached= 0; //FIXME hack, ffplay maybe should not use url_feof() to test for the end
|
||||
|
||||
|
@ -69,19 +69,19 @@ static const int huff_iid[] = {
|
||||
|
||||
static VLC vlc_ps[10];
|
||||
|
||||
/**
|
||||
* Read Inter-channel Intensity Difference/Inter-Channel Coherence/
|
||||
* Inter-channel Phase Difference/Overall Phase Difference parameters from the
|
||||
* bitstream.
|
||||
*
|
||||
* @param avctx contains the current codec context
|
||||
* @param gb pointer to the input bitstream
|
||||
* @param ps pointer to the Parametric Stereo context
|
||||
* @param PAR pointer to the parameter to be read
|
||||
* @param e envelope to decode
|
||||
* @param dt 1: time delta-coded, 0: frequency delta-coded
|
||||
*/
|
||||
#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION) \
|
||||
/** \
|
||||
* Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \
|
||||
* Inter-channel Phase Difference/Overall Phase Difference parameters from the \
|
||||
* bitstream. \
|
||||
* \
|
||||
* @param avctx contains the current codec context \
|
||||
* @param gb pointer to the input bitstream \
|
||||
* @param ps pointer to the Parametric Stereo context \
|
||||
* @param PAR pointer to the parameter to be read \
|
||||
* @param e envelope to decode \
|
||||
* @param dt 1: time delta-coded, 0: frequency delta-coded \
|
||||
*/ \
|
||||
static int read_ ## PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, \
|
||||
int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \
|
||||
{ \
|
||||
|
@ -770,424 +770,6 @@ static av_always_inline int get_chroma_qp(H264Context *h, int t, int qscale){
|
||||
return h->pps.chroma_qp_table[t][qscale];
|
||||
}
|
||||
|
||||
static void fill_decode_neighbors(H264Context *h, int mb_type){
|
||||
MpegEncContext * const s = &h->s;
|
||||
const int mb_xy= h->mb_xy;
|
||||
int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS];
|
||||
static const uint8_t left_block_options[4][32]={
|
||||
{0,1,2,3,7,10,8,11,3+0*4, 3+1*4, 3+2*4, 3+3*4, 1+4*4, 1+8*4, 1+5*4, 1+9*4},
|
||||
{2,2,3,3,8,11,8,11,3+2*4, 3+2*4, 3+3*4, 3+3*4, 1+5*4, 1+9*4, 1+5*4, 1+9*4},
|
||||
{0,0,1,1,7,10,7,10,3+0*4, 3+0*4, 3+1*4, 3+1*4, 1+4*4, 1+8*4, 1+4*4, 1+8*4},
|
||||
{0,2,0,2,7,10,7,10,3+0*4, 3+2*4, 3+0*4, 3+2*4, 1+4*4, 1+8*4, 1+4*4, 1+8*4}
|
||||
};
|
||||
|
||||
h->topleft_partition= -1;
|
||||
|
||||
top_xy = mb_xy - (s->mb_stride << MB_FIELD);
|
||||
|
||||
/* Wow, what a mess, why didn't they simplify the interlacing & intra
|
||||
* stuff, I can't imagine that these complex rules are worth it. */
|
||||
|
||||
topleft_xy = top_xy - 1;
|
||||
topright_xy= top_xy + 1;
|
||||
left_xy[LBOT] = left_xy[LTOP] = mb_xy-1;
|
||||
h->left_block = left_block_options[0];
|
||||
if(FRAME_MBAFF){
|
||||
const int left_mb_field_flag = IS_INTERLACED(s->current_picture.f.mb_type[mb_xy - 1]);
|
||||
const int curr_mb_field_flag = IS_INTERLACED(mb_type);
|
||||
if(s->mb_y&1){
|
||||
if (left_mb_field_flag != curr_mb_field_flag) {
|
||||
left_xy[LBOT] = left_xy[LTOP] = mb_xy - s->mb_stride - 1;
|
||||
if (curr_mb_field_flag) {
|
||||
left_xy[LBOT] += s->mb_stride;
|
||||
h->left_block = left_block_options[3];
|
||||
} else {
|
||||
topleft_xy += s->mb_stride;
|
||||
// take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
|
||||
h->topleft_partition = 0;
|
||||
h->left_block = left_block_options[1];
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(curr_mb_field_flag){
|
||||
topleft_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy - 1] >> 7) & 1) - 1);
|
||||
topright_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy + 1] >> 7) & 1) - 1);
|
||||
top_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy ] >> 7) & 1) - 1);
|
||||
}
|
||||
if (left_mb_field_flag != curr_mb_field_flag) {
|
||||
if (curr_mb_field_flag) {
|
||||
left_xy[LBOT] += s->mb_stride;
|
||||
h->left_block = left_block_options[3];
|
||||
} else {
|
||||
h->left_block = left_block_options[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h->topleft_mb_xy = topleft_xy;
|
||||
h->top_mb_xy = top_xy;
|
||||
h->topright_mb_xy= topright_xy;
|
||||
h->left_mb_xy[LTOP] = left_xy[LTOP];
|
||||
h->left_mb_xy[LBOT] = left_xy[LBOT];
|
||||
//FIXME do we need all in the context?
|
||||
|
||||
h->topleft_type = s->current_picture.f.mb_type[topleft_xy];
|
||||
h->top_type = s->current_picture.f.mb_type[top_xy];
|
||||
h->topright_type = s->current_picture.f.mb_type[topright_xy];
|
||||
h->left_type[LTOP] = s->current_picture.f.mb_type[left_xy[LTOP]];
|
||||
h->left_type[LBOT] = s->current_picture.f.mb_type[left_xy[LBOT]];
|
||||
|
||||
if(FMO){
|
||||
if(h->slice_table[topleft_xy ] != h->slice_num) h->topleft_type = 0;
|
||||
if(h->slice_table[top_xy ] != h->slice_num) h->top_type = 0;
|
||||
if(h->slice_table[left_xy[LTOP] ] != h->slice_num) h->left_type[LTOP] = h->left_type[LBOT] = 0;
|
||||
}else{
|
||||
if(h->slice_table[topleft_xy ] != h->slice_num){
|
||||
h->topleft_type = 0;
|
||||
if(h->slice_table[top_xy ] != h->slice_num) h->top_type = 0;
|
||||
if(h->slice_table[left_xy[LTOP] ] != h->slice_num) h->left_type[LTOP] = h->left_type[LBOT] = 0;
|
||||
}
|
||||
}
|
||||
if(h->slice_table[topright_xy] != h->slice_num) h->topright_type= 0;
|
||||
}
|
||||
|
||||
static void fill_decode_caches(H264Context *h, int mb_type){
|
||||
MpegEncContext * const s = &h->s;
|
||||
int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS];
|
||||
int topleft_type, top_type, topright_type, left_type[LEFT_MBS];
|
||||
const uint8_t * left_block= h->left_block;
|
||||
int i;
|
||||
uint8_t *nnz;
|
||||
uint8_t *nnz_cache;
|
||||
|
||||
topleft_xy = h->topleft_mb_xy;
|
||||
top_xy = h->top_mb_xy;
|
||||
topright_xy = h->topright_mb_xy;
|
||||
left_xy[LTOP] = h->left_mb_xy[LTOP];
|
||||
left_xy[LBOT] = h->left_mb_xy[LBOT];
|
||||
topleft_type = h->topleft_type;
|
||||
top_type = h->top_type;
|
||||
topright_type = h->topright_type;
|
||||
left_type[LTOP]= h->left_type[LTOP];
|
||||
left_type[LBOT]= h->left_type[LBOT];
|
||||
|
||||
if(!IS_SKIP(mb_type)){
|
||||
if(IS_INTRA(mb_type)){
|
||||
int type_mask= h->pps.constrained_intra_pred ? IS_INTRA(-1) : -1;
|
||||
h->topleft_samples_available=
|
||||
h->top_samples_available=
|
||||
h->left_samples_available= 0xFFFF;
|
||||
h->topright_samples_available= 0xEEEA;
|
||||
|
||||
if(!(top_type & type_mask)){
|
||||
h->topleft_samples_available= 0xB3FF;
|
||||
h->top_samples_available= 0x33FF;
|
||||
h->topright_samples_available= 0x26EA;
|
||||
}
|
||||
if(IS_INTERLACED(mb_type) != IS_INTERLACED(left_type[LTOP])){
|
||||
if(IS_INTERLACED(mb_type)){
|
||||
if(!(left_type[LTOP] & type_mask)){
|
||||
h->topleft_samples_available&= 0xDFFF;
|
||||
h->left_samples_available&= 0x5FFF;
|
||||
}
|
||||
if(!(left_type[LBOT] & type_mask)){
|
||||
h->topleft_samples_available&= 0xFF5F;
|
||||
h->left_samples_available&= 0xFF5F;
|
||||
}
|
||||
}else{
|
||||
int left_typei = s->current_picture.f.mb_type[left_xy[LTOP] + s->mb_stride];
|
||||
|
||||
assert(left_xy[LTOP] == left_xy[LBOT]);
|
||||
if(!((left_typei & type_mask) && (left_type[LTOP] & type_mask))){
|
||||
h->topleft_samples_available&= 0xDF5F;
|
||||
h->left_samples_available&= 0x5F5F;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(!(left_type[LTOP] & type_mask)){
|
||||
h->topleft_samples_available&= 0xDF5F;
|
||||
h->left_samples_available&= 0x5F5F;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(topleft_type & type_mask))
|
||||
h->topleft_samples_available&= 0x7FFF;
|
||||
|
||||
if(!(topright_type & type_mask))
|
||||
h->topright_samples_available&= 0xFBFF;
|
||||
|
||||
if(IS_INTRA4x4(mb_type)){
|
||||
if(IS_INTRA4x4(top_type)){
|
||||
AV_COPY32(h->intra4x4_pred_mode_cache+4+8*0, h->intra4x4_pred_mode + h->mb2br_xy[top_xy]);
|
||||
}else{
|
||||
h->intra4x4_pred_mode_cache[4+8*0]=
|
||||
h->intra4x4_pred_mode_cache[5+8*0]=
|
||||
h->intra4x4_pred_mode_cache[6+8*0]=
|
||||
h->intra4x4_pred_mode_cache[7+8*0]= 2 - 3*!(top_type & type_mask);
|
||||
}
|
||||
for(i=0; i<2; i++){
|
||||
if(IS_INTRA4x4(left_type[LEFT(i)])){
|
||||
int8_t *mode= h->intra4x4_pred_mode + h->mb2br_xy[left_xy[LEFT(i)]];
|
||||
h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= mode[6-left_block[0+2*i]];
|
||||
h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= mode[6-left_block[1+2*i]];
|
||||
}else{
|
||||
h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
|
||||
h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= 2 - 3*!(left_type[LEFT(i)] & type_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
0 . T T. T T T T
|
||||
1 L . .L . . . .
|
||||
2 L . .L . . . .
|
||||
3 . T TL . . . .
|
||||
4 L . .L . . . .
|
||||
5 L . .. . . . .
|
||||
*/
|
||||
//FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec)
|
||||
nnz_cache = h->non_zero_count_cache;
|
||||
if(top_type){
|
||||
nnz = h->non_zero_count[top_xy];
|
||||
AV_COPY32(&nnz_cache[4+8* 0], &nnz[4*3]);
|
||||
if(CHROMA444){
|
||||
AV_COPY32(&nnz_cache[4+8* 5], &nnz[4* 7]);
|
||||
AV_COPY32(&nnz_cache[4+8*10], &nnz[4*11]);
|
||||
}else{
|
||||
AV_COPY32(&nnz_cache[4+8* 5], &nnz[4* 5]);
|
||||
AV_COPY32(&nnz_cache[4+8*10], &nnz[4* 9]);
|
||||
}
|
||||
}else{
|
||||
uint32_t top_empty = CABAC && !IS_INTRA(mb_type) ? 0 : 0x40404040;
|
||||
AV_WN32A(&nnz_cache[4+8* 0], top_empty);
|
||||
AV_WN32A(&nnz_cache[4+8* 5], top_empty);
|
||||
AV_WN32A(&nnz_cache[4+8*10], top_empty);
|
||||
}
|
||||
|
||||
for (i=0; i<2; i++) {
|
||||
if(left_type[LEFT(i)]){
|
||||
nnz = h->non_zero_count[left_xy[LEFT(i)]];
|
||||
nnz_cache[3+8* 1 + 2*8*i]= nnz[left_block[8+0+2*i]];
|
||||
nnz_cache[3+8* 2 + 2*8*i]= nnz[left_block[8+1+2*i]];
|
||||
if(CHROMA444){
|
||||
nnz_cache[3+8* 6 + 2*8*i]= nnz[left_block[8+0+2*i]+4*4];
|
||||
nnz_cache[3+8* 7 + 2*8*i]= nnz[left_block[8+1+2*i]+4*4];
|
||||
nnz_cache[3+8*11 + 2*8*i]= nnz[left_block[8+0+2*i]+8*4];
|
||||
nnz_cache[3+8*12 + 2*8*i]= nnz[left_block[8+1+2*i]+8*4];
|
||||
}else{
|
||||
nnz_cache[3+8* 6 + 8*i]= nnz[left_block[8+4+2*i]];
|
||||
nnz_cache[3+8*11 + 8*i]= nnz[left_block[8+5+2*i]];
|
||||
}
|
||||
}else{
|
||||
nnz_cache[3+8* 1 + 2*8*i]=
|
||||
nnz_cache[3+8* 2 + 2*8*i]=
|
||||
nnz_cache[3+8* 6 + 2*8*i]=
|
||||
nnz_cache[3+8* 7 + 2*8*i]=
|
||||
nnz_cache[3+8*11 + 2*8*i]=
|
||||
nnz_cache[3+8*12 + 2*8*i]= CABAC && !IS_INTRA(mb_type) ? 0 : 64;
|
||||
}
|
||||
}
|
||||
|
||||
if( CABAC ) {
|
||||
// top_cbp
|
||||
if(top_type) {
|
||||
h->top_cbp = h->cbp_table[top_xy];
|
||||
} else {
|
||||
h->top_cbp = IS_INTRA(mb_type) ? 0x7CF : 0x00F;
|
||||
}
|
||||
// left_cbp
|
||||
if (left_type[LTOP]) {
|
||||
h->left_cbp = (h->cbp_table[left_xy[LTOP]] & 0x7F0)
|
||||
| ((h->cbp_table[left_xy[LTOP]]>>(left_block[0]&(~1)))&2)
|
||||
| (((h->cbp_table[left_xy[LBOT]]>>(left_block[2]&(~1)))&2) << 2);
|
||||
} else {
|
||||
h->left_cbp = IS_INTRA(mb_type) ? 0x7CF : 0x00F;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(IS_INTER(mb_type) || (IS_DIRECT(mb_type) && h->direct_spatial_mv_pred)){
|
||||
int list;
|
||||
int b_stride = h->b_stride;
|
||||
for(list=0; list<h->list_count; list++){
|
||||
int8_t *ref_cache = &h->ref_cache[list][scan8[0]];
|
||||
int8_t *ref = s->current_picture.f.ref_index[list];
|
||||
int16_t (*mv_cache)[2] = &h->mv_cache[list][scan8[0]];
|
||||
int16_t (*mv)[2] = s->current_picture.f.motion_val[list];
|
||||
if(!USES_LIST(mb_type, list)){
|
||||
continue;
|
||||
}
|
||||
assert(!(IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred));
|
||||
|
||||
if(USES_LIST(top_type, list)){
|
||||
const int b_xy= h->mb2b_xy[top_xy] + 3*b_stride;
|
||||
AV_COPY128(mv_cache[0 - 1*8], mv[b_xy + 0]);
|
||||
ref_cache[0 - 1*8]=
|
||||
ref_cache[1 - 1*8]= ref[4*top_xy + 2];
|
||||
ref_cache[2 - 1*8]=
|
||||
ref_cache[3 - 1*8]= ref[4*top_xy + 3];
|
||||
}else{
|
||||
AV_ZERO128(mv_cache[0 - 1*8]);
|
||||
AV_WN32A(&ref_cache[0 - 1*8], ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101);
|
||||
}
|
||||
|
||||
if(mb_type & (MB_TYPE_16x8|MB_TYPE_8x8)){
|
||||
for(i=0; i<2; i++){
|
||||
int cache_idx = -1 + i*2*8;
|
||||
if(USES_LIST(left_type[LEFT(i)], list)){
|
||||
const int b_xy= h->mb2b_xy[left_xy[LEFT(i)]] + 3;
|
||||
const int b8_xy= 4*left_xy[LEFT(i)] + 1;
|
||||
AV_COPY32(mv_cache[cache_idx ], mv[b_xy + b_stride*left_block[0+i*2]]);
|
||||
AV_COPY32(mv_cache[cache_idx+8], mv[b_xy + b_stride*left_block[1+i*2]]);
|
||||
ref_cache[cache_idx ]= ref[b8_xy + (left_block[0+i*2]&~1)];
|
||||
ref_cache[cache_idx+8]= ref[b8_xy + (left_block[1+i*2]&~1)];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[cache_idx ]);
|
||||
AV_ZERO32(mv_cache[cache_idx+8]);
|
||||
ref_cache[cache_idx ]=
|
||||
ref_cache[cache_idx+8]= (left_type[LEFT(i)]) ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(USES_LIST(left_type[LTOP], list)){
|
||||
const int b_xy= h->mb2b_xy[left_xy[LTOP]] + 3;
|
||||
const int b8_xy= 4*left_xy[LTOP] + 1;
|
||||
AV_COPY32(mv_cache[-1], mv[b_xy + b_stride*left_block[0]]);
|
||||
ref_cache[-1]= ref[b8_xy + (left_block[0]&~1)];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[-1]);
|
||||
ref_cache[-1]= left_type[LTOP] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
if(USES_LIST(topright_type, list)){
|
||||
const int b_xy= h->mb2b_xy[topright_xy] + 3*b_stride;
|
||||
AV_COPY32(mv_cache[4 - 1*8], mv[b_xy]);
|
||||
ref_cache[4 - 1*8]= ref[4*topright_xy + 2];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[4 - 1*8]);
|
||||
ref_cache[4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
if(ref_cache[4 - 1*8] < 0){
|
||||
if(USES_LIST(topleft_type, list)){
|
||||
const int b_xy = h->mb2b_xy[topleft_xy] + 3 + b_stride + (h->topleft_partition & 2*b_stride);
|
||||
const int b8_xy= 4*topleft_xy + 1 + (h->topleft_partition & 2);
|
||||
AV_COPY32(mv_cache[-1 - 1*8], mv[b_xy]);
|
||||
ref_cache[-1 - 1*8]= ref[b8_xy];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[-1 - 1*8]);
|
||||
ref_cache[-1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
if((mb_type&(MB_TYPE_SKIP|MB_TYPE_DIRECT2)) && !FRAME_MBAFF)
|
||||
continue;
|
||||
|
||||
if(!(mb_type&(MB_TYPE_SKIP|MB_TYPE_DIRECT2))){
|
||||
uint8_t (*mvd_cache)[2] = &h->mvd_cache[list][scan8[0]];
|
||||
uint8_t (*mvd)[2] = h->mvd_table[list];
|
||||
ref_cache[2+8*0] =
|
||||
ref_cache[2+8*2] = PART_NOT_AVAILABLE;
|
||||
AV_ZERO32(mv_cache[2+8*0]);
|
||||
AV_ZERO32(mv_cache[2+8*2]);
|
||||
|
||||
if( CABAC ) {
|
||||
if(USES_LIST(top_type, list)){
|
||||
const int b_xy= h->mb2br_xy[top_xy];
|
||||
AV_COPY64(mvd_cache[0 - 1*8], mvd[b_xy + 0]);
|
||||
}else{
|
||||
AV_ZERO64(mvd_cache[0 - 1*8]);
|
||||
}
|
||||
if(USES_LIST(left_type[LTOP], list)){
|
||||
const int b_xy= h->mb2br_xy[left_xy[LTOP]] + 6;
|
||||
AV_COPY16(mvd_cache[-1 + 0*8], mvd[b_xy - left_block[0]]);
|
||||
AV_COPY16(mvd_cache[-1 + 1*8], mvd[b_xy - left_block[1]]);
|
||||
}else{
|
||||
AV_ZERO16(mvd_cache[-1 + 0*8]);
|
||||
AV_ZERO16(mvd_cache[-1 + 1*8]);
|
||||
}
|
||||
if(USES_LIST(left_type[LBOT], list)){
|
||||
const int b_xy= h->mb2br_xy[left_xy[LBOT]] + 6;
|
||||
AV_COPY16(mvd_cache[-1 + 2*8], mvd[b_xy - left_block[2]]);
|
||||
AV_COPY16(mvd_cache[-1 + 3*8], mvd[b_xy - left_block[3]]);
|
||||
}else{
|
||||
AV_ZERO16(mvd_cache[-1 + 2*8]);
|
||||
AV_ZERO16(mvd_cache[-1 + 3*8]);
|
||||
}
|
||||
AV_ZERO16(mvd_cache[2+8*0]);
|
||||
AV_ZERO16(mvd_cache[2+8*2]);
|
||||
if(h->slice_type_nos == AV_PICTURE_TYPE_B){
|
||||
uint8_t *direct_cache = &h->direct_cache[scan8[0]];
|
||||
uint8_t *direct_table = h->direct_table;
|
||||
fill_rectangle(direct_cache, 4, 4, 8, MB_TYPE_16x16>>1, 1);
|
||||
|
||||
if(IS_DIRECT(top_type)){
|
||||
AV_WN32A(&direct_cache[-1*8], 0x01010101u*(MB_TYPE_DIRECT2>>1));
|
||||
}else if(IS_8X8(top_type)){
|
||||
int b8_xy = 4*top_xy;
|
||||
direct_cache[0 - 1*8]= direct_table[b8_xy + 2];
|
||||
direct_cache[2 - 1*8]= direct_table[b8_xy + 3];
|
||||
}else{
|
||||
AV_WN32A(&direct_cache[-1*8], 0x01010101*(MB_TYPE_16x16>>1));
|
||||
}
|
||||
|
||||
if(IS_DIRECT(left_type[LTOP]))
|
||||
direct_cache[-1 + 0*8]= MB_TYPE_DIRECT2>>1;
|
||||
else if(IS_8X8(left_type[LTOP]))
|
||||
direct_cache[-1 + 0*8]= direct_table[4*left_xy[LTOP] + 1 + (left_block[0]&~1)];
|
||||
else
|
||||
direct_cache[-1 + 0*8]= MB_TYPE_16x16>>1;
|
||||
|
||||
if(IS_DIRECT(left_type[LBOT]))
|
||||
direct_cache[-1 + 2*8]= MB_TYPE_DIRECT2>>1;
|
||||
else if(IS_8X8(left_type[LBOT]))
|
||||
direct_cache[-1 + 2*8]= direct_table[4*left_xy[LBOT] + 1 + (left_block[2]&~1)];
|
||||
else
|
||||
direct_cache[-1 + 2*8]= MB_TYPE_16x16>>1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(FRAME_MBAFF){
|
||||
#define MAP_MVS\
|
||||
MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\
|
||||
MAP_F2F(scan8[0] + 0 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 1 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 2 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 3 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\
|
||||
MAP_F2F(scan8[0] - 1 + 0*8, left_type[LTOP])\
|
||||
MAP_F2F(scan8[0] - 1 + 1*8, left_type[LTOP])\
|
||||
MAP_F2F(scan8[0] - 1 + 2*8, left_type[LBOT])\
|
||||
MAP_F2F(scan8[0] - 1 + 3*8, left_type[LBOT])
|
||||
if(MB_FIELD){
|
||||
#define MAP_F2F(idx, mb_type)\
|
||||
if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
|
||||
h->ref_cache[list][idx] <<= 1;\
|
||||
h->mv_cache[list][idx][1] /= 2;\
|
||||
h->mvd_cache[list][idx][1] >>=1;\
|
||||
}
|
||||
MAP_MVS
|
||||
#undef MAP_F2F
|
||||
}else{
|
||||
#define MAP_F2F(idx, mb_type)\
|
||||
if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
|
||||
h->ref_cache[list][idx] >>= 1;\
|
||||
h->mv_cache[list][idx][1] <<= 1;\
|
||||
h->mvd_cache[list][idx][1] <<= 1;\
|
||||
}
|
||||
MAP_MVS
|
||||
#undef MAP_F2F
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[LTOP]);
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the predicted intra4x4 prediction mode.
|
||||
*/
|
||||
|
@ -327,6 +327,424 @@ zeromv:
|
||||
return;
|
||||
}
|
||||
|
||||
static void fill_decode_neighbors(H264Context *h, int mb_type){
|
||||
MpegEncContext * const s = &h->s;
|
||||
const int mb_xy= h->mb_xy;
|
||||
int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS];
|
||||
static const uint8_t left_block_options[4][32]={
|
||||
{0,1,2,3,7,10,8,11,3+0*4, 3+1*4, 3+2*4, 3+3*4, 1+4*4, 1+8*4, 1+5*4, 1+9*4},
|
||||
{2,2,3,3,8,11,8,11,3+2*4, 3+2*4, 3+3*4, 3+3*4, 1+5*4, 1+9*4, 1+5*4, 1+9*4},
|
||||
{0,0,1,1,7,10,7,10,3+0*4, 3+0*4, 3+1*4, 3+1*4, 1+4*4, 1+8*4, 1+4*4, 1+8*4},
|
||||
{0,2,0,2,7,10,7,10,3+0*4, 3+2*4, 3+0*4, 3+2*4, 1+4*4, 1+8*4, 1+4*4, 1+8*4}
|
||||
};
|
||||
|
||||
h->topleft_partition= -1;
|
||||
|
||||
top_xy = mb_xy - (s->mb_stride << MB_FIELD);
|
||||
|
||||
/* Wow, what a mess, why didn't they simplify the interlacing & intra
|
||||
* stuff, I can't imagine that these complex rules are worth it. */
|
||||
|
||||
topleft_xy = top_xy - 1;
|
||||
topright_xy= top_xy + 1;
|
||||
left_xy[LBOT] = left_xy[LTOP] = mb_xy-1;
|
||||
h->left_block = left_block_options[0];
|
||||
if(FRAME_MBAFF){
|
||||
const int left_mb_field_flag = IS_INTERLACED(s->current_picture.f.mb_type[mb_xy - 1]);
|
||||
const int curr_mb_field_flag = IS_INTERLACED(mb_type);
|
||||
if(s->mb_y&1){
|
||||
if (left_mb_field_flag != curr_mb_field_flag) {
|
||||
left_xy[LBOT] = left_xy[LTOP] = mb_xy - s->mb_stride - 1;
|
||||
if (curr_mb_field_flag) {
|
||||
left_xy[LBOT] += s->mb_stride;
|
||||
h->left_block = left_block_options[3];
|
||||
} else {
|
||||
topleft_xy += s->mb_stride;
|
||||
// take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
|
||||
h->topleft_partition = 0;
|
||||
h->left_block = left_block_options[1];
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(curr_mb_field_flag){
|
||||
topleft_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy - 1] >> 7) & 1) - 1);
|
||||
topright_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy + 1] >> 7) & 1) - 1);
|
||||
top_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy ] >> 7) & 1) - 1);
|
||||
}
|
||||
if (left_mb_field_flag != curr_mb_field_flag) {
|
||||
if (curr_mb_field_flag) {
|
||||
left_xy[LBOT] += s->mb_stride;
|
||||
h->left_block = left_block_options[3];
|
||||
} else {
|
||||
h->left_block = left_block_options[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h->topleft_mb_xy = topleft_xy;
|
||||
h->top_mb_xy = top_xy;
|
||||
h->topright_mb_xy= topright_xy;
|
||||
h->left_mb_xy[LTOP] = left_xy[LTOP];
|
||||
h->left_mb_xy[LBOT] = left_xy[LBOT];
|
||||
//FIXME do we need all in the context?
|
||||
|
||||
h->topleft_type = s->current_picture.f.mb_type[topleft_xy];
|
||||
h->top_type = s->current_picture.f.mb_type[top_xy];
|
||||
h->topright_type = s->current_picture.f.mb_type[topright_xy];
|
||||
h->left_type[LTOP] = s->current_picture.f.mb_type[left_xy[LTOP]];
|
||||
h->left_type[LBOT] = s->current_picture.f.mb_type[left_xy[LBOT]];
|
||||
|
||||
if(FMO){
|
||||
if(h->slice_table[topleft_xy ] != h->slice_num) h->topleft_type = 0;
|
||||
if(h->slice_table[top_xy ] != h->slice_num) h->top_type = 0;
|
||||
if(h->slice_table[left_xy[LTOP] ] != h->slice_num) h->left_type[LTOP] = h->left_type[LBOT] = 0;
|
||||
}else{
|
||||
if(h->slice_table[topleft_xy ] != h->slice_num){
|
||||
h->topleft_type = 0;
|
||||
if(h->slice_table[top_xy ] != h->slice_num) h->top_type = 0;
|
||||
if(h->slice_table[left_xy[LTOP] ] != h->slice_num) h->left_type[LTOP] = h->left_type[LBOT] = 0;
|
||||
}
|
||||
}
|
||||
if(h->slice_table[topright_xy] != h->slice_num) h->topright_type= 0;
|
||||
}
|
||||
|
||||
static void fill_decode_caches(H264Context *h, int mb_type){
|
||||
MpegEncContext * const s = &h->s;
|
||||
int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS];
|
||||
int topleft_type, top_type, topright_type, left_type[LEFT_MBS];
|
||||
const uint8_t * left_block= h->left_block;
|
||||
int i;
|
||||
uint8_t *nnz;
|
||||
uint8_t *nnz_cache;
|
||||
|
||||
topleft_xy = h->topleft_mb_xy;
|
||||
top_xy = h->top_mb_xy;
|
||||
topright_xy = h->topright_mb_xy;
|
||||
left_xy[LTOP] = h->left_mb_xy[LTOP];
|
||||
left_xy[LBOT] = h->left_mb_xy[LBOT];
|
||||
topleft_type = h->topleft_type;
|
||||
top_type = h->top_type;
|
||||
topright_type = h->topright_type;
|
||||
left_type[LTOP]= h->left_type[LTOP];
|
||||
left_type[LBOT]= h->left_type[LBOT];
|
||||
|
||||
if(!IS_SKIP(mb_type)){
|
||||
if(IS_INTRA(mb_type)){
|
||||
int type_mask= h->pps.constrained_intra_pred ? IS_INTRA(-1) : -1;
|
||||
h->topleft_samples_available=
|
||||
h->top_samples_available=
|
||||
h->left_samples_available= 0xFFFF;
|
||||
h->topright_samples_available= 0xEEEA;
|
||||
|
||||
if(!(top_type & type_mask)){
|
||||
h->topleft_samples_available= 0xB3FF;
|
||||
h->top_samples_available= 0x33FF;
|
||||
h->topright_samples_available= 0x26EA;
|
||||
}
|
||||
if(IS_INTERLACED(mb_type) != IS_INTERLACED(left_type[LTOP])){
|
||||
if(IS_INTERLACED(mb_type)){
|
||||
if(!(left_type[LTOP] & type_mask)){
|
||||
h->topleft_samples_available&= 0xDFFF;
|
||||
h->left_samples_available&= 0x5FFF;
|
||||
}
|
||||
if(!(left_type[LBOT] & type_mask)){
|
||||
h->topleft_samples_available&= 0xFF5F;
|
||||
h->left_samples_available&= 0xFF5F;
|
||||
}
|
||||
}else{
|
||||
int left_typei = s->current_picture.f.mb_type[left_xy[LTOP] + s->mb_stride];
|
||||
|
||||
assert(left_xy[LTOP] == left_xy[LBOT]);
|
||||
if(!((left_typei & type_mask) && (left_type[LTOP] & type_mask))){
|
||||
h->topleft_samples_available&= 0xDF5F;
|
||||
h->left_samples_available&= 0x5F5F;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(!(left_type[LTOP] & type_mask)){
|
||||
h->topleft_samples_available&= 0xDF5F;
|
||||
h->left_samples_available&= 0x5F5F;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(topleft_type & type_mask))
|
||||
h->topleft_samples_available&= 0x7FFF;
|
||||
|
||||
if(!(topright_type & type_mask))
|
||||
h->topright_samples_available&= 0xFBFF;
|
||||
|
||||
if(IS_INTRA4x4(mb_type)){
|
||||
if(IS_INTRA4x4(top_type)){
|
||||
AV_COPY32(h->intra4x4_pred_mode_cache+4+8*0, h->intra4x4_pred_mode + h->mb2br_xy[top_xy]);
|
||||
}else{
|
||||
h->intra4x4_pred_mode_cache[4+8*0]=
|
||||
h->intra4x4_pred_mode_cache[5+8*0]=
|
||||
h->intra4x4_pred_mode_cache[6+8*0]=
|
||||
h->intra4x4_pred_mode_cache[7+8*0]= 2 - 3*!(top_type & type_mask);
|
||||
}
|
||||
for(i=0; i<2; i++){
|
||||
if(IS_INTRA4x4(left_type[LEFT(i)])){
|
||||
int8_t *mode= h->intra4x4_pred_mode + h->mb2br_xy[left_xy[LEFT(i)]];
|
||||
h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= mode[6-left_block[0+2*i]];
|
||||
h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= mode[6-left_block[1+2*i]];
|
||||
}else{
|
||||
h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
|
||||
h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= 2 - 3*!(left_type[LEFT(i)] & type_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
0 . T T. T T T T
|
||||
1 L . .L . . . .
|
||||
2 L . .L . . . .
|
||||
3 . T TL . . . .
|
||||
4 L . .L . . . .
|
||||
5 L . .. . . . .
|
||||
*/
|
||||
//FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec)
|
||||
nnz_cache = h->non_zero_count_cache;
|
||||
if(top_type){
|
||||
nnz = h->non_zero_count[top_xy];
|
||||
AV_COPY32(&nnz_cache[4+8* 0], &nnz[4*3]);
|
||||
if(CHROMA444){
|
||||
AV_COPY32(&nnz_cache[4+8* 5], &nnz[4* 7]);
|
||||
AV_COPY32(&nnz_cache[4+8*10], &nnz[4*11]);
|
||||
}else{
|
||||
AV_COPY32(&nnz_cache[4+8* 5], &nnz[4* 5]);
|
||||
AV_COPY32(&nnz_cache[4+8*10], &nnz[4* 9]);
|
||||
}
|
||||
}else{
|
||||
uint32_t top_empty = CABAC && !IS_INTRA(mb_type) ? 0 : 0x40404040;
|
||||
AV_WN32A(&nnz_cache[4+8* 0], top_empty);
|
||||
AV_WN32A(&nnz_cache[4+8* 5], top_empty);
|
||||
AV_WN32A(&nnz_cache[4+8*10], top_empty);
|
||||
}
|
||||
|
||||
for (i=0; i<2; i++) {
|
||||
if(left_type[LEFT(i)]){
|
||||
nnz = h->non_zero_count[left_xy[LEFT(i)]];
|
||||
nnz_cache[3+8* 1 + 2*8*i]= nnz[left_block[8+0+2*i]];
|
||||
nnz_cache[3+8* 2 + 2*8*i]= nnz[left_block[8+1+2*i]];
|
||||
if(CHROMA444){
|
||||
nnz_cache[3+8* 6 + 2*8*i]= nnz[left_block[8+0+2*i]+4*4];
|
||||
nnz_cache[3+8* 7 + 2*8*i]= nnz[left_block[8+1+2*i]+4*4];
|
||||
nnz_cache[3+8*11 + 2*8*i]= nnz[left_block[8+0+2*i]+8*4];
|
||||
nnz_cache[3+8*12 + 2*8*i]= nnz[left_block[8+1+2*i]+8*4];
|
||||
}else{
|
||||
nnz_cache[3+8* 6 + 8*i]= nnz[left_block[8+4+2*i]];
|
||||
nnz_cache[3+8*11 + 8*i]= nnz[left_block[8+5+2*i]];
|
||||
}
|
||||
}else{
|
||||
nnz_cache[3+8* 1 + 2*8*i]=
|
||||
nnz_cache[3+8* 2 + 2*8*i]=
|
||||
nnz_cache[3+8* 6 + 2*8*i]=
|
||||
nnz_cache[3+8* 7 + 2*8*i]=
|
||||
nnz_cache[3+8*11 + 2*8*i]=
|
||||
nnz_cache[3+8*12 + 2*8*i]= CABAC && !IS_INTRA(mb_type) ? 0 : 64;
|
||||
}
|
||||
}
|
||||
|
||||
if( CABAC ) {
|
||||
// top_cbp
|
||||
if(top_type) {
|
||||
h->top_cbp = h->cbp_table[top_xy];
|
||||
} else {
|
||||
h->top_cbp = IS_INTRA(mb_type) ? 0x7CF : 0x00F;
|
||||
}
|
||||
// left_cbp
|
||||
if (left_type[LTOP]) {
|
||||
h->left_cbp = (h->cbp_table[left_xy[LTOP]] & 0x7F0)
|
||||
| ((h->cbp_table[left_xy[LTOP]]>>(left_block[0]&(~1)))&2)
|
||||
| (((h->cbp_table[left_xy[LBOT]]>>(left_block[2]&(~1)))&2) << 2);
|
||||
} else {
|
||||
h->left_cbp = IS_INTRA(mb_type) ? 0x7CF : 0x00F;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(IS_INTER(mb_type) || (IS_DIRECT(mb_type) && h->direct_spatial_mv_pred)){
|
||||
int list;
|
||||
int b_stride = h->b_stride;
|
||||
for(list=0; list<h->list_count; list++){
|
||||
int8_t *ref_cache = &h->ref_cache[list][scan8[0]];
|
||||
int8_t *ref = s->current_picture.f.ref_index[list];
|
||||
int16_t (*mv_cache)[2] = &h->mv_cache[list][scan8[0]];
|
||||
int16_t (*mv)[2] = s->current_picture.f.motion_val[list];
|
||||
if(!USES_LIST(mb_type, list)){
|
||||
continue;
|
||||
}
|
||||
assert(!(IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred));
|
||||
|
||||
if(USES_LIST(top_type, list)){
|
||||
const int b_xy= h->mb2b_xy[top_xy] + 3*b_stride;
|
||||
AV_COPY128(mv_cache[0 - 1*8], mv[b_xy + 0]);
|
||||
ref_cache[0 - 1*8]=
|
||||
ref_cache[1 - 1*8]= ref[4*top_xy + 2];
|
||||
ref_cache[2 - 1*8]=
|
||||
ref_cache[3 - 1*8]= ref[4*top_xy + 3];
|
||||
}else{
|
||||
AV_ZERO128(mv_cache[0 - 1*8]);
|
||||
AV_WN32A(&ref_cache[0 - 1*8], ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101);
|
||||
}
|
||||
|
||||
if(mb_type & (MB_TYPE_16x8|MB_TYPE_8x8)){
|
||||
for(i=0; i<2; i++){
|
||||
int cache_idx = -1 + i*2*8;
|
||||
if(USES_LIST(left_type[LEFT(i)], list)){
|
||||
const int b_xy= h->mb2b_xy[left_xy[LEFT(i)]] + 3;
|
||||
const int b8_xy= 4*left_xy[LEFT(i)] + 1;
|
||||
AV_COPY32(mv_cache[cache_idx ], mv[b_xy + b_stride*left_block[0+i*2]]);
|
||||
AV_COPY32(mv_cache[cache_idx+8], mv[b_xy + b_stride*left_block[1+i*2]]);
|
||||
ref_cache[cache_idx ]= ref[b8_xy + (left_block[0+i*2]&~1)];
|
||||
ref_cache[cache_idx+8]= ref[b8_xy + (left_block[1+i*2]&~1)];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[cache_idx ]);
|
||||
AV_ZERO32(mv_cache[cache_idx+8]);
|
||||
ref_cache[cache_idx ]=
|
||||
ref_cache[cache_idx+8]= (left_type[LEFT(i)]) ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(USES_LIST(left_type[LTOP], list)){
|
||||
const int b_xy= h->mb2b_xy[left_xy[LTOP]] + 3;
|
||||
const int b8_xy= 4*left_xy[LTOP] + 1;
|
||||
AV_COPY32(mv_cache[-1], mv[b_xy + b_stride*left_block[0]]);
|
||||
ref_cache[-1]= ref[b8_xy + (left_block[0]&~1)];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[-1]);
|
||||
ref_cache[-1]= left_type[LTOP] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
if(USES_LIST(topright_type, list)){
|
||||
const int b_xy= h->mb2b_xy[topright_xy] + 3*b_stride;
|
||||
AV_COPY32(mv_cache[4 - 1*8], mv[b_xy]);
|
||||
ref_cache[4 - 1*8]= ref[4*topright_xy + 2];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[4 - 1*8]);
|
||||
ref_cache[4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
if(ref_cache[4 - 1*8] < 0){
|
||||
if(USES_LIST(topleft_type, list)){
|
||||
const int b_xy = h->mb2b_xy[topleft_xy] + 3 + b_stride + (h->topleft_partition & 2*b_stride);
|
||||
const int b8_xy= 4*topleft_xy + 1 + (h->topleft_partition & 2);
|
||||
AV_COPY32(mv_cache[-1 - 1*8], mv[b_xy]);
|
||||
ref_cache[-1 - 1*8]= ref[b8_xy];
|
||||
}else{
|
||||
AV_ZERO32(mv_cache[-1 - 1*8]);
|
||||
ref_cache[-1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
if((mb_type&(MB_TYPE_SKIP|MB_TYPE_DIRECT2)) && !FRAME_MBAFF)
|
||||
continue;
|
||||
|
||||
if(!(mb_type&(MB_TYPE_SKIP|MB_TYPE_DIRECT2))){
|
||||
uint8_t (*mvd_cache)[2] = &h->mvd_cache[list][scan8[0]];
|
||||
uint8_t (*mvd)[2] = h->mvd_table[list];
|
||||
ref_cache[2+8*0] =
|
||||
ref_cache[2+8*2] = PART_NOT_AVAILABLE;
|
||||
AV_ZERO32(mv_cache[2+8*0]);
|
||||
AV_ZERO32(mv_cache[2+8*2]);
|
||||
|
||||
if( CABAC ) {
|
||||
if(USES_LIST(top_type, list)){
|
||||
const int b_xy= h->mb2br_xy[top_xy];
|
||||
AV_COPY64(mvd_cache[0 - 1*8], mvd[b_xy + 0]);
|
||||
}else{
|
||||
AV_ZERO64(mvd_cache[0 - 1*8]);
|
||||
}
|
||||
if(USES_LIST(left_type[LTOP], list)){
|
||||
const int b_xy= h->mb2br_xy[left_xy[LTOP]] + 6;
|
||||
AV_COPY16(mvd_cache[-1 + 0*8], mvd[b_xy - left_block[0]]);
|
||||
AV_COPY16(mvd_cache[-1 + 1*8], mvd[b_xy - left_block[1]]);
|
||||
}else{
|
||||
AV_ZERO16(mvd_cache[-1 + 0*8]);
|
||||
AV_ZERO16(mvd_cache[-1 + 1*8]);
|
||||
}
|
||||
if(USES_LIST(left_type[LBOT], list)){
|
||||
const int b_xy= h->mb2br_xy[left_xy[LBOT]] + 6;
|
||||
AV_COPY16(mvd_cache[-1 + 2*8], mvd[b_xy - left_block[2]]);
|
||||
AV_COPY16(mvd_cache[-1 + 3*8], mvd[b_xy - left_block[3]]);
|
||||
}else{
|
||||
AV_ZERO16(mvd_cache[-1 + 2*8]);
|
||||
AV_ZERO16(mvd_cache[-1 + 3*8]);
|
||||
}
|
||||
AV_ZERO16(mvd_cache[2+8*0]);
|
||||
AV_ZERO16(mvd_cache[2+8*2]);
|
||||
if(h->slice_type_nos == AV_PICTURE_TYPE_B){
|
||||
uint8_t *direct_cache = &h->direct_cache[scan8[0]];
|
||||
uint8_t *direct_table = h->direct_table;
|
||||
fill_rectangle(direct_cache, 4, 4, 8, MB_TYPE_16x16>>1, 1);
|
||||
|
||||
if(IS_DIRECT(top_type)){
|
||||
AV_WN32A(&direct_cache[-1*8], 0x01010101u*(MB_TYPE_DIRECT2>>1));
|
||||
}else if(IS_8X8(top_type)){
|
||||
int b8_xy = 4*top_xy;
|
||||
direct_cache[0 - 1*8]= direct_table[b8_xy + 2];
|
||||
direct_cache[2 - 1*8]= direct_table[b8_xy + 3];
|
||||
}else{
|
||||
AV_WN32A(&direct_cache[-1*8], 0x01010101*(MB_TYPE_16x16>>1));
|
||||
}
|
||||
|
||||
if(IS_DIRECT(left_type[LTOP]))
|
||||
direct_cache[-1 + 0*8]= MB_TYPE_DIRECT2>>1;
|
||||
else if(IS_8X8(left_type[LTOP]))
|
||||
direct_cache[-1 + 0*8]= direct_table[4*left_xy[LTOP] + 1 + (left_block[0]&~1)];
|
||||
else
|
||||
direct_cache[-1 + 0*8]= MB_TYPE_16x16>>1;
|
||||
|
||||
if(IS_DIRECT(left_type[LBOT]))
|
||||
direct_cache[-1 + 2*8]= MB_TYPE_DIRECT2>>1;
|
||||
else if(IS_8X8(left_type[LBOT]))
|
||||
direct_cache[-1 + 2*8]= direct_table[4*left_xy[LBOT] + 1 + (left_block[2]&~1)];
|
||||
else
|
||||
direct_cache[-1 + 2*8]= MB_TYPE_16x16>>1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(FRAME_MBAFF){
|
||||
#define MAP_MVS\
|
||||
MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\
|
||||
MAP_F2F(scan8[0] + 0 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 1 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 2 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 3 - 1*8, top_type)\
|
||||
MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\
|
||||
MAP_F2F(scan8[0] - 1 + 0*8, left_type[LTOP])\
|
||||
MAP_F2F(scan8[0] - 1 + 1*8, left_type[LTOP])\
|
||||
MAP_F2F(scan8[0] - 1 + 2*8, left_type[LBOT])\
|
||||
MAP_F2F(scan8[0] - 1 + 3*8, left_type[LBOT])
|
||||
if(MB_FIELD){
|
||||
#define MAP_F2F(idx, mb_type)\
|
||||
if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
|
||||
h->ref_cache[list][idx] <<= 1;\
|
||||
h->mv_cache[list][idx][1] /= 2;\
|
||||
h->mvd_cache[list][idx][1] >>=1;\
|
||||
}
|
||||
MAP_MVS
|
||||
#undef MAP_F2F
|
||||
}else{
|
||||
#define MAP_F2F(idx, mb_type)\
|
||||
if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
|
||||
h->ref_cache[list][idx] >>= 1;\
|
||||
h->mv_cache[list][idx][1] <<= 1;\
|
||||
h->mvd_cache[list][idx][1] <<= 1;\
|
||||
}
|
||||
MAP_MVS
|
||||
#undef MAP_F2F
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[LTOP]);
|
||||
}
|
||||
|
||||
/**
|
||||
* decodes a P_SKIP or B_SKIP macroblock
|
||||
*/
|
||||
|
@ -149,10 +149,8 @@ static int estimate_best_order(double *ref, int min_order, int max_order)
|
||||
/**
|
||||
* Calculate LPC coefficients for multiple orders
|
||||
*
|
||||
* @param lpc_type LPC method for determining coefficients
|
||||
* 0 = LPC with fixed pre-defined coeffs
|
||||
* 1 = LPC with coeffs determined by Levinson-Durbin recursion
|
||||
* 2+ = LPC with coeffs determined by Cholesky factorization using (use_lpc-1) passes.
|
||||
* @param lpc_type LPC method for determining coefficients,
|
||||
* see #FFLPCType for details
|
||||
*/
|
||||
int ff_lpc_calc_coefs(LPCContext *s,
|
||||
const int32_t *samples, int blocksize, int min_order,
|
||||
|
@ -1892,7 +1892,7 @@ AVCodec ff_msmpeg4v1_decoder = {
|
||||
NULL,
|
||||
ff_h263_decode_end,
|
||||
ff_h263_decode_frame,
|
||||
CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_EXPERIMENTAL,
|
||||
CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
||||
.max_lowres= 3,
|
||||
.long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
|
||||
.pix_fmts= ff_pixfmt_list_420,
|
||||
|
@ -21,7 +21,7 @@
|
||||
#define AVCODEC_VERSION_H
|
||||
|
||||
#define LIBAVCODEC_VERSION_MAJOR 53
|
||||
#define LIBAVCODEC_VERSION_MINOR 7
|
||||
#define LIBAVCODEC_VERSION_MINOR 8
|
||||
#define LIBAVCODEC_VERSION_MICRO 0
|
||||
|
||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||
|
@ -29,11 +29,19 @@ SECTION_RODATA
|
||||
|
||||
SECTION .text
|
||||
|
||||
cextern pw_16
|
||||
cextern pw_8
|
||||
cextern pw_4
|
||||
cextern pw_2
|
||||
cextern pw_1
|
||||
|
||||
pw_m32101234: dw -3, -2, -1, 0, 1, 2, 3, 4
|
||||
pw_m3: times 8 dw -3
|
||||
pw_pixel_max: times 8 dw ((1 << 10)-1)
|
||||
pw_512: times 8 dw 512
|
||||
pd_17: times 4 dd 17
|
||||
pd_16: times 4 dd 16
|
||||
|
||||
; dest, left, right, src
|
||||
; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
|
||||
%macro PRED4x4_LOWPASS 4
|
||||
@ -464,7 +472,92 @@ PRED8x8_TOP_DC mmxext, pshufw
|
||||
INIT_XMM
|
||||
PRED8x8_TOP_DC sse2 , pshuflw
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred8x8_plane(pixel *src, int stride)
|
||||
;-----------------------------------------------------------------------------
|
||||
INIT_XMM
|
||||
cglobal pred8x8_plane_10_sse2, 2,7,7
|
||||
sub r0, r1
|
||||
lea r2, [r1+r1*2]
|
||||
lea r3, [r0+r1*4]
|
||||
mova m2, [r0]
|
||||
pmaddwd m2, [pw_m32101234]
|
||||
HADDD m2, m1
|
||||
movd m0, [r0-4]
|
||||
psrld m0, 14
|
||||
psubw m2, m0 ; H
|
||||
movd m0, [r3+r1*4-4]
|
||||
movd m1, [r0+12]
|
||||
paddw m0, m1
|
||||
psllw m0, 4 ; 16*(src[7*stride-1] + src[-stride+7])
|
||||
movzx r4d, word [r3+r1*1-2] ; src[4*stride-1]
|
||||
movzx r5d, word [r0+r2*1-2] ; src[2*stride-1]
|
||||
sub r4d, r5d
|
||||
movzx r6d, word [r3+r1*2-2] ; src[5*stride-1]
|
||||
movzx r5d, word [r0+r1*2-2] ; src[1*stride-1]
|
||||
sub r6d, r5d
|
||||
lea r4d, [r4+r6*2]
|
||||
movzx r5d, word [r3+r2*1-2] ; src[6*stride-1]
|
||||
movzx r6d, word [r0+r1*1-2] ; src[0*stride-1]
|
||||
sub r5d, r6d
|
||||
lea r5d, [r5+r5*2]
|
||||
add r4d, r5d
|
||||
movzx r6d, word [r3+r1*4-2] ; src[7*stride-1]
|
||||
movzx r5d, word [r0+r1*0-2] ; src[ -stride-1]
|
||||
sub r6d, r5d
|
||||
lea r4d, [r4+r6*4]
|
||||
movd m3, r4d ; V
|
||||
punpckldq m2, m3
|
||||
pmaddwd m2, [pd_17]
|
||||
paddd m2, [pd_16]
|
||||
psrad m2, 5 ; b, c
|
||||
|
||||
mova m3, [pw_pixel_max]
|
||||
pxor m1, m1
|
||||
SPLATW m0, m0, 1
|
||||
SPLATW m4, m2, 2
|
||||
SPLATW m2, m2, 0
|
||||
pmullw m2, [pw_m32101234] ; b
|
||||
pmullw m5, m4, [pw_m3] ; c
|
||||
paddw m5, [pw_16]
|
||||
mov r2d, 8
|
||||
add r0, r1
|
||||
.loop:
|
||||
paddsw m6, m2, m5
|
||||
paddsw m6, m0
|
||||
psraw m6, 5
|
||||
CLIPW m6, m1, m3
|
||||
mova [r0], m6
|
||||
paddw m5, m4
|
||||
add r0, r1
|
||||
dec r2d
|
||||
jg .loop
|
||||
REP_RET
|
||||
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred8x8l_128_dc(pixel *src, int has_topleft, int has_topright, int stride)
|
||||
;-----------------------------------------------------------------------------
|
||||
%macro PRED8x8L_128_DC 1
|
||||
cglobal pred8x8l_128_dc_10_%1, 4,4
|
||||
mova m0, [pw_512]
|
||||
lea r1, [r3+r3*2]
|
||||
lea r2, [r0+r3*4]
|
||||
MOV8 r0+r3*0, m0, m0
|
||||
MOV8 r0+r3*1, m0, m0
|
||||
MOV8 r0+r3*2, m0, m0
|
||||
MOV8 r0+r1*1, m0, m0
|
||||
MOV8 r2+r3*0, m0, m0
|
||||
MOV8 r2+r3*1, m0, m0
|
||||
MOV8 r2+r3*2, m0, m0
|
||||
MOV8 r2+r1*1, m0, m0
|
||||
RET
|
||||
%endmacro
|
||||
|
||||
INIT_MMX
|
||||
PRED8x8L_128_DC mmxext
|
||||
INIT_XMM
|
||||
PRED8x8L_128_DC sse2
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred8x8l_top_dc(pixel *src, int has_topleft, int has_topright, int stride)
|
||||
@ -1258,7 +1351,7 @@ cglobal pred16x16_horizontal_10_%1, 2,3
|
||||
MOV16 r0+r1*1, m1, m1, m1, m1
|
||||
lea r0, [r0+r1*2]
|
||||
dec r2
|
||||
jge .vloop
|
||||
jg .vloop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
@ -1266,3 +1359,139 @@ INIT_MMX
|
||||
PRED16x16_HORIZONTAL mmxext
|
||||
INIT_XMM
|
||||
PRED16x16_HORIZONTAL sse2
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred16x16_dc(pixel *src, int stride)
|
||||
;-----------------------------------------------------------------------------
|
||||
%macro PRED16x16_DC 1
|
||||
cglobal pred16x16_dc_10_%1, 2,7
|
||||
mov r4, r0
|
||||
sub r0, r1
|
||||
mova m0, [r0+0]
|
||||
paddw m0, [r0+mmsize]
|
||||
%if mmsize==8
|
||||
paddw m0, [r0+16]
|
||||
paddw m0, [r0+24]
|
||||
%endif
|
||||
HADDW m0, m2
|
||||
|
||||
sub r0, 2
|
||||
movzx r3d, word [r0+r1*1]
|
||||
movzx r5d, word [r0+r1*2]
|
||||
%rep 7
|
||||
lea r0, [r0+r1*2]
|
||||
movzx r2d, word [r0+r1*1]
|
||||
add r3d, r2d
|
||||
movzx r2d, word [r0+r1*2]
|
||||
add r5d, r2d
|
||||
%endrep
|
||||
lea r3d, [r3+r5+16]
|
||||
|
||||
movd m1, r3d
|
||||
paddw m0, m1
|
||||
psrlw m0, 5
|
||||
SPLATW m0, m0
|
||||
mov r3d, 8
|
||||
.loop:
|
||||
MOV16 r4+r1*0, m0, m0, m0, m0
|
||||
MOV16 r4+r1*1, m0, m0, m0, m0
|
||||
lea r4, [r4+r1*2]
|
||||
dec r3d
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_MMX
|
||||
PRED16x16_DC mmxext
|
||||
INIT_XMM
|
||||
PRED16x16_DC sse2
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred16x16_top_dc(pixel *src, int stride)
|
||||
;-----------------------------------------------------------------------------
|
||||
%macro PRED16x16_TOP_DC 1
|
||||
cglobal pred16x16_top_dc_10_%1, 2,3
|
||||
sub r0, r1
|
||||
mova m0, [r0+0]
|
||||
paddw m0, [r0+mmsize]
|
||||
%if mmsize==8
|
||||
paddw m0, [r0+16]
|
||||
paddw m0, [r0+24]
|
||||
%endif
|
||||
HADDW m0, m2
|
||||
|
||||
SPLATW m0, m0
|
||||
paddw m0, [pw_8]
|
||||
psrlw m0, 4
|
||||
mov r2d, 8
|
||||
.loop:
|
||||
MOV16 r0+r1*1, m0, m0, m0, m0
|
||||
MOV16 r0+r1*2, m0, m0, m0, m0
|
||||
lea r0, [r0+r1*2]
|
||||
dec r2d
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_MMX
|
||||
PRED16x16_TOP_DC mmxext
|
||||
INIT_XMM
|
||||
PRED16x16_TOP_DC sse2
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred16x16_left_dc(pixel *src, int stride)
|
||||
;-----------------------------------------------------------------------------
|
||||
%macro PRED16x16_LEFT_DC 1
|
||||
cglobal pred16x16_left_dc_10_%1, 2,7
|
||||
mov r4, r0
|
||||
|
||||
sub r0, 2
|
||||
movzx r5d, word [r0+r1*0]
|
||||
movzx r6d, word [r0+r1*1]
|
||||
%rep 7
|
||||
lea r0, [r0+r1*2]
|
||||
movzx r2d, word [r0+r1*0]
|
||||
movzx r3d, word [r0+r1*1]
|
||||
add r5d, r2d
|
||||
add r6d, r3d
|
||||
%endrep
|
||||
lea r2d, [r5+r6+8]
|
||||
shr r2d, 4
|
||||
|
||||
movd m0, r2d
|
||||
SPLATW m0, m0
|
||||
mov r3d, 8
|
||||
.loop:
|
||||
MOV16 r4+r1*0, m0, m0, m0, m0
|
||||
MOV16 r4+r1*1, m0, m0, m0, m0
|
||||
lea r4, [r4+r1*2]
|
||||
dec r3d
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_MMX
|
||||
PRED16x16_LEFT_DC mmxext
|
||||
INIT_XMM
|
||||
PRED16x16_LEFT_DC sse2
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void pred16x16_128_dc(pixel *src, int stride)
|
||||
;-----------------------------------------------------------------------------
|
||||
%macro PRED16x16_128_DC 1
|
||||
cglobal pred16x16_128_dc_10_%1, 2,3
|
||||
mova m0, [pw_512]
|
||||
mov r2d, 8
|
||||
.loop:
|
||||
MOV16 r0+r1*0, m0, m0, m0, m0
|
||||
MOV16 r0+r1*1, m0, m0, m0, m0
|
||||
lea r0, [r0+r1*2]
|
||||
dec r2d
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_MMX
|
||||
PRED16x16_128_DC mmxext
|
||||
INIT_XMM
|
||||
PRED16x16_128_DC sse2
|
||||
|
@ -47,6 +47,7 @@ PRED8x8(dc, 10, mmxext)
|
||||
PRED8x8(dc, 10, sse2)
|
||||
PRED8x8(top_dc, 10, mmxext)
|
||||
PRED8x8(top_dc, 10, sse2)
|
||||
PRED8x8(plane, 10, sse2)
|
||||
PRED8x8(vertical, 10, sse2)
|
||||
PRED8x8(horizontal, 10, sse2)
|
||||
|
||||
@ -55,6 +56,8 @@ void ff_pred8x8l_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int has_tople
|
||||
|
||||
PRED8x8L(dc, 10, sse2)
|
||||
PRED8x8L(dc, 10, ssse3)
|
||||
PRED8x8L(128_dc, 10, mmxext)
|
||||
PRED8x8L(128_dc, 10, sse2)
|
||||
PRED8x8L(top_dc, 10, sse2)
|
||||
PRED8x8L(top_dc, 10, ssse3)
|
||||
PRED8x8L(vertical, 10, sse2)
|
||||
@ -73,6 +76,14 @@ PRED8x8L(horizontal_up, 10, ssse3)
|
||||
#define PRED16x16(TYPE, DEPTH, OPT)\
|
||||
void ff_pred16x16_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int stride);
|
||||
|
||||
PRED16x16(dc, 10, mmxext)
|
||||
PRED16x16(dc, 10, sse2)
|
||||
PRED16x16(top_dc, 10, mmxext)
|
||||
PRED16x16(top_dc, 10, sse2)
|
||||
PRED16x16(128_dc, 10, mmxext)
|
||||
PRED16x16(128_dc, 10, sse2)
|
||||
PRED16x16(left_dc, 10, mmxext)
|
||||
PRED16x16(left_dc, 10, sse2)
|
||||
PRED16x16(vertical, 10, mmxext)
|
||||
PRED16x16(vertical, 10, sse2)
|
||||
PRED16x16(horizontal, 10, mmxext)
|
||||
@ -289,6 +300,12 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
|
||||
h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_10_mmxext;
|
||||
h->pred8x8[TOP_DC_PRED8x8 ] = ff_pred8x8_top_dc_10_mmxext;
|
||||
|
||||
h->pred8x8l[DC_128_PRED ] = ff_pred8x8l_128_dc_10_mmxext;
|
||||
|
||||
h->pred16x16[DC_PRED8x8 ] = ff_pred16x16_dc_10_mmxext;
|
||||
h->pred16x16[TOP_DC_PRED8x8 ] = ff_pred16x16_top_dc_10_mmxext;
|
||||
h->pred16x16[DC_128_PRED8x8 ] = ff_pred16x16_128_dc_10_mmxext;
|
||||
h->pred16x16[LEFT_DC_PRED8x8 ] = ff_pred16x16_left_dc_10_mmxext;
|
||||
h->pred16x16[VERT_PRED8x8 ] = ff_pred16x16_vertical_10_mmxext;
|
||||
h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_horizontal_10_mmxext;
|
||||
}
|
||||
@ -301,18 +318,24 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
|
||||
|
||||
h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_10_sse2;
|
||||
h->pred8x8[TOP_DC_PRED8x8 ] = ff_pred8x8_top_dc_10_sse2;
|
||||
h->pred8x8[PLANE_PRED8x8 ] = ff_pred8x8_plane_10_sse2;
|
||||
h->pred8x8[VERT_PRED8x8 ] = ff_pred8x8_vertical_10_sse2;
|
||||
h->pred8x8[HOR_PRED8x8 ] = ff_pred8x8_horizontal_10_sse2;
|
||||
|
||||
h->pred8x8l[VERT_PRED ] = ff_pred8x8l_vertical_10_sse2;
|
||||
h->pred8x8l[HOR_PRED ] = ff_pred8x8l_horizontal_10_sse2;
|
||||
h->pred8x8l[DC_PRED ] = ff_pred8x8l_dc_10_sse2;
|
||||
h->pred8x8l[DC_128_PRED ] = ff_pred8x8l_128_dc_10_sse2;
|
||||
h->pred8x8l[TOP_DC_PRED ] = ff_pred8x8l_top_dc_10_sse2;
|
||||
h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_sse2;
|
||||
h->pred8x8l[DIAG_DOWN_RIGHT_PRED] = ff_pred8x8l_down_right_10_sse2;
|
||||
h->pred8x8l[VERT_RIGHT_PRED ] = ff_pred8x8l_vertical_right_10_sse2;
|
||||
h->pred8x8l[HOR_UP_PRED ] = ff_pred8x8l_horizontal_up_10_sse2;
|
||||
|
||||
h->pred16x16[DC_PRED8x8 ] = ff_pred16x16_dc_10_sse2;
|
||||
h->pred16x16[TOP_DC_PRED8x8 ] = ff_pred16x16_top_dc_10_sse2;
|
||||
h->pred16x16[DC_128_PRED8x8 ] = ff_pred16x16_128_dc_10_sse2;
|
||||
h->pred16x16[LEFT_DC_PRED8x8 ] = ff_pred16x16_left_dc_10_sse2;
|
||||
h->pred16x16[VERT_PRED8x8 ] = ff_pred16x16_vertical_10_sse2;
|
||||
h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_horizontal_10_sse2;
|
||||
}
|
||||
|
@ -141,6 +141,8 @@ static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int ind
|
||||
* corresponding filter instance which is added to graph with
|
||||
* create_filter().
|
||||
*
|
||||
* @param filt_ctx Pointer that is set to the created and configured filter
|
||||
* context on success, set to NULL on failure.
|
||||
* @param filt_ctx put here a pointer to the created filter context on
|
||||
* success, NULL otherwise
|
||||
* @param buf pointer to the buffer to parse, *buf will be updated to
|
||||
|
@ -80,16 +80,16 @@ void ff_rdt_subscribe_rule(char *cmd, int size,
|
||||
*
|
||||
* @param buf input buffer
|
||||
* @param len length of input buffer
|
||||
* @param set_id will be set to the set ID this packet belongs to
|
||||
* @param seq_no will be set to the sequence number of the packet
|
||||
* @param stream_id will be set to the stream ID this packet belongs to
|
||||
* @param is_keyframe will be whether this packet belongs to a keyframe
|
||||
* @param timestamp will be set to the timestamp of the packet
|
||||
* @param pset_id will be set to the set ID this packet belongs to
|
||||
* @param pseq_no will be set to the sequence number of the packet
|
||||
* @param pstream_id will be set to the stream ID this packet belongs to
|
||||
* @param pis_keyframe will be whether this packet belongs to a keyframe
|
||||
* @param ptimestamp will be set to the timestamp of the packet
|
||||
* @return the amount of bytes consumed, or negative on error
|
||||
*/
|
||||
int ff_rdt_parse_header(const uint8_t *buf, int len,
|
||||
int *set_id, int *seq_no, int *stream_id,
|
||||
int *is_keyframe, uint32_t *timestamp);
|
||||
int *pset_id, int *pseq_no, int *pstream_id,
|
||||
int *pis_keyframe, uint32_t *ptimestamp);
|
||||
|
||||
/**
|
||||
* Parse RDT-style packet data (header + media data).
|
||||
|
@ -488,9 +488,9 @@ void ff_rtsp_close_streams(AVFormatContext *s);
|
||||
/**
|
||||
* Close all connection handles within the RTSP (de)muxer
|
||||
*
|
||||
* @param rt RTSP (de)muxer context
|
||||
* @param s RTSP (de)muxer context
|
||||
*/
|
||||
void ff_rtsp_close_connections(AVFormatContext *rt);
|
||||
void ff_rtsp_close_connections(AVFormatContext *s);
|
||||
|
||||
/**
|
||||
* Get the description of the stream and set up the RTSPStream child
|
||||
|
@ -74,12 +74,12 @@ typedef struct URLProtocol {
|
||||
* @return 0 in case of success, a negative value corresponding to an
|
||||
* AVERROR code in case of failure
|
||||
*/
|
||||
int ffurl_alloc(URLContext **h, const char *url, int flags);
|
||||
int ffurl_alloc(URLContext **puc, const char *filename, int flags);
|
||||
|
||||
/**
|
||||
* Connect an URLContext that has been allocated by ffurl_alloc
|
||||
*/
|
||||
int ffurl_connect(URLContext *h);
|
||||
int ffurl_connect(URLContext *uc);
|
||||
|
||||
/**
|
||||
* Create an URLContext for accessing to the resource indicated by
|
||||
@ -92,7 +92,7 @@ int ffurl_connect(URLContext *h);
|
||||
* @return 0 in case of success, a negative value corresponding to an
|
||||
* AVERROR code in case of failure
|
||||
*/
|
||||
int ffurl_open(URLContext **h, const char *url, int flags);
|
||||
int ffurl_open(URLContext **puc, const char *filename, int flags);
|
||||
|
||||
/**
|
||||
* Read up to size bytes from the resource accessed by h, and store
|
||||
|
@ -2438,7 +2438,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
least one frame of codec data, this makes sure the codec initializes
|
||||
the channel configuration and does not only trust the values from the container.
|
||||
*/
|
||||
try_decode_frame(st, pkt, (options && i <= orig_nb_streams )? &options[i] : NULL);
|
||||
try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
|
||||
|
||||
st->codec_info_nb_frames++;
|
||||
count++;
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include "libavutil/avutil.h"
|
||||
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 53
|
||||
#define LIBAVFORMAT_VERSION_MINOR 5
|
||||
#define LIBAVFORMAT_VERSION_MINOR 6
|
||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
||||
|
||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||
|
@ -484,7 +484,7 @@ static time_t mktimegm(struct tm *tm)
|
||||
return t;
|
||||
}
|
||||
|
||||
int av_parse_time(int64_t *timeval, const char *datestr, int duration)
|
||||
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
|
||||
{
|
||||
const char *p;
|
||||
int64_t t;
|
||||
@ -506,19 +506,19 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration)
|
||||
#undef time
|
||||
time_t now = time(0);
|
||||
|
||||
len = strlen(datestr);
|
||||
len = strlen(timestr);
|
||||
if (len > 0)
|
||||
lastch = datestr[len - 1];
|
||||
lastch = timestr[len - 1];
|
||||
else
|
||||
lastch = '\0';
|
||||
is_utc = (lastch == 'z' || lastch == 'Z');
|
||||
|
||||
memset(&dt, 0, sizeof(dt));
|
||||
|
||||
p = datestr;
|
||||
p = timestr;
|
||||
q = NULL;
|
||||
if (!duration) {
|
||||
if (!strncasecmp(datestr, "now", len)) {
|
||||
if (!strncasecmp(timestr, "now", len)) {
|
||||
*timeval = (int64_t) now * 1000000;
|
||||
return 0;
|
||||
}
|
||||
@ -555,15 +555,15 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* parse datestr as a duration */
|
||||
/* parse timestr as a duration */
|
||||
if (p[0] == '-') {
|
||||
negative = 1;
|
||||
++p;
|
||||
}
|
||||
/* parse datestr as HH:MM:SS */
|
||||
/* parse timestr as HH:MM:SS */
|
||||
q = small_strptime(p, time_fmt[0], &dt);
|
||||
if (!q) {
|
||||
/* parse datestr as S+ */
|
||||
/* parse timestr as S+ */
|
||||
dt.tm_sec = strtol(p, (char **)&q, 10);
|
||||
if (q == p) {
|
||||
/* the parsing didn't succeed */
|
||||
|
@ -83,7 +83,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
|
||||
* January, 1970 up to the time of the parsed date. If timestr cannot
|
||||
* be successfully parsed, set *time to INT64_MIN.
|
||||
|
||||
* @param datestr a string representing a date or a duration.
|
||||
* @param timestr a string representing a date or a duration.
|
||||
* - If a date the syntax is:
|
||||
* @code
|
||||
* [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z]
|
||||
|
@ -218,7 +218,7 @@ struct SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat
|
||||
* top-bottom or bottom-top order. If slices are provided in
|
||||
* non-sequential order the behavior of the function is undefined.
|
||||
*
|
||||
* @param context the scaling context previously created with
|
||||
* @param c the scaling context previously created with
|
||||
* sws_getContext()
|
||||
* @param srcSlice the array containing the pointers to the planes of
|
||||
* the source slice
|
||||
@ -235,8 +235,9 @@ struct SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat
|
||||
* the destination image
|
||||
* @return the height of the output slice
|
||||
*/
|
||||
int sws_scale(struct SwsContext *context, const uint8_t* const srcSlice[], const int srcStride[],
|
||||
int srcSliceY, int srcSliceH, uint8_t* const dst[], const int dstStride[]);
|
||||
int sws_scale(struct SwsContext *c, const uint8_t* const srcSlice[],
|
||||
const int srcStride[], int srcSliceY, int srcSliceH,
|
||||
uint8_t* const dst[], const int dstStride[]);
|
||||
|
||||
#if LIBSWSCALE_VERSION_MAJOR < 1
|
||||
/**
|
||||
|
@ -686,18 +686,19 @@ static int check_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt,
|
||||
* swscale wrapper, so we don't need to export the SwsContext.
|
||||
* Assumes planar YUV to be in YUV order instead of YVU.
|
||||
*/
|
||||
int sws_scale(SwsContext *c, const uint8_t* const src[], const int srcStride[], int srcSliceY,
|
||||
int srcSliceH, uint8_t* const dst[], const int dstStride[])
|
||||
int sws_scale(struct SwsContext *c, const uint8_t* const srcSlice[],
|
||||
const int srcStride[], int srcSliceY, int srcSliceH,
|
||||
uint8_t* const dst[], const int dstStride[])
|
||||
{
|
||||
int i;
|
||||
const uint8_t* src2[4]= {src[0], src[1], src[2], src[3]};
|
||||
const uint8_t* src2[4]= {srcSlice[0], srcSlice[1], srcSlice[2], srcSlice[3]};
|
||||
uint8_t* dst2[4]= {dst[0], dst[1], dst[2], dst[3]};
|
||||
|
||||
// do not mess up sliceDir if we have a "trailing" 0-size slice
|
||||
if (srcSliceH == 0)
|
||||
return 0;
|
||||
|
||||
if (!check_image_pointers(src, c->srcFormat, srcStride)) {
|
||||
if (!check_image_pointers(srcSlice, c->srcFormat, srcStride)) {
|
||||
av_log(c, AV_LOG_ERROR, "bad src image pointers\n");
|
||||
return 0;
|
||||
}
|
||||
@ -718,7 +719,7 @@ int sws_scale(SwsContext *c, const uint8_t* const src[], const int srcStride[],
|
||||
for (i=0; i<256; i++) {
|
||||
int p, r, g, b, y, u, v, a = 0xff;
|
||||
if(c->srcFormat == PIX_FMT_PAL8) {
|
||||
p=((const uint32_t*)(src[1]))[i];
|
||||
p=((const uint32_t*)(srcSlice[1]))[i];
|
||||
a= (p>>24)&0xFF;
|
||||
r= (p>>16)&0xFF;
|
||||
g= (p>> 8)&0xFF;
|
||||
|
@ -717,7 +717,9 @@ static void getSubSampleFactors(int *h, int *v, enum PixelFormat format)
|
||||
*v = av_pix_fmt_descriptors[format].log2_chroma_h;
|
||||
}
|
||||
|
||||
int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
|
||||
int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4],
|
||||
int srcRange, const int table[4], int dstRange,
|
||||
int brightness, int contrast, int saturation)
|
||||
{
|
||||
memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);
|
||||
memcpy(c->dstColorspaceTable, table, sizeof(int)*4);
|
||||
@ -740,7 +742,9 @@ int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation)
|
||||
int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
|
||||
int *srcRange, int **table, int *dstRange,
|
||||
int *brightness, int *contrast, int *saturation)
|
||||
{
|
||||
if (!c || isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user