static const AVClass *format_child_class_next(const AVClass *prev) { AVInputFormat *ifmt = NULL; AVOutputFormat *ofmt = NULL; while (prev && (ifmt = av_iformat_next(ifmt))) if (ifmt->priv_class == prev){ prev = NULL; break; } if (!prev) while (ifmt = av_iformat_next(ifmt)) if (ifmt->priv_class) return ifmt->priv_class; while (prev && (ofmt = av_oformat_next(ofmt))) if (ofmt->priv_class == prev){ prev = NULL; break; } if (!prev) while (ofmt = av_oformat_next(ofmt)) if (ofmt->priv_class) return ofmt->priv_class; #if !FF_API_OLD_AVIO if (prev != &ffio_url_class) return &ffio_url_class; #endif return NULL; }
static const AVClass *format_child_class_next(const AVClass *prev) { AVInputFormat *ifmt = NULL; AVOutputFormat *ofmt = NULL; if (!prev) #if !FF_API_OLD_AVIO return &ffio_url_class; #else prev = (void *)&ifmt; // Dummy pointer; #endif while ((ifmt = av_iformat_next(ifmt))) if (ifmt->priv_class == prev) break; if (!ifmt) while ((ofmt = av_oformat_next(ofmt))) if (ofmt->priv_class == prev) break; if (!ofmt) while (ifmt = av_iformat_next(ifmt)) if (ifmt->priv_class) return ifmt->priv_class; while (ofmt = av_oformat_next(ofmt)) if (ofmt->priv_class) return ofmt->priv_class; return NULL; }
void av_lib_setup (void) { if ( !av_lib_init ) { /* Setup error message capture */ av_log_set_callback(av_err_callback); av_log_set_level(AV_LOG_VERBOSE); /* Register all the codecs */ av_register_all(); DEBUGF("decoder_thread: av_register_all\n"); avcodec_init(); avcodec_register_all(); DEBUGF("decoder_thread: avcodec_register_all\n"); AVInputFormat *p = NULL; p = av_iformat_next(p); while (p) { VDEBUGF("decoder_thread: %s: %s:\n", p->name, p->long_name); p = av_iformat_next(p); }; VDEBUGF("decoder_thread: %s\n", avformat_configuration() ); av_lib_init = true; } }
static const AVClass *format_child_class_next(const AVClass *prev) { AVInputFormat *ifmt = NULL; AVOutputFormat *ofmt = NULL; if (!prev) return &ffio_url_class; while ((ifmt = av_iformat_next(ifmt))) if (ifmt->priv_class == prev) break; if (!ifmt) while ((ofmt = av_oformat_next(ofmt))) if (ofmt->priv_class == prev) break; if (!ofmt) while (ifmt = av_iformat_next(ifmt)) if (ifmt->priv_class) return ifmt->priv_class; while (ofmt = av_oformat_next(ofmt)) if (ofmt->priv_class) return ofmt->priv_class; return NULL; }
static GHashTable * create_extension_dict (void) { GHashTable * dict = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) str_unref, NULL); AVInputFormat * f; for (f = av_iformat_next (NULL); f; f = av_iformat_next (f)) { if (! f->extensions) continue; gchar * exts = g_ascii_strdown (f->extensions, -1); gchar * parse, * next; for (parse = exts; parse; parse = next) { next = strchr (parse, ','); if (next) { * next = 0; next ++; } g_hash_table_insert (dict, str_get(parse), f); } g_free (exts); } return dict; }
/* API: refresh the list of devices */ static pj_status_t ffmpeg_factory_refresh(pjmedia_vid_dev_factory *f) { ffmpeg_factory *ff = (ffmpeg_factory*)f; AVInputFormat *p; ffmpeg_dev_info *info; av_log_set_callback(&print_ffmpeg_log); av_log_set_level(AV_LOG_DEBUG); if (ff->dev_pool) { pj_pool_release(ff->dev_pool); ff->dev_pool = NULL; } /* TODO: this should enumerate devices, now it enumerates host APIs */ ff->dev_count = 0; ff->dev_pool = pj_pool_create(ff->pf, "ffmpeg_cap_dev", 500, 500, NULL); p = av_iformat_next(NULL); while (p) { if (p->flags & AVFMT_NOFILE) { unsigned i; info = &ff->dev_info[ff->dev_count++]; pj_bzero(info, sizeof(*info)); pj_ansi_strncpy(info->base.name, "default", sizeof(info->base.name)); pj_ansi_snprintf(info->base.driver, sizeof(info->base.driver), "%s (ffmpeg)", p->name); info->base.dir = PJMEDIA_DIR_CAPTURE; info->base.has_callback = PJ_FALSE; info->host_api = p; #if (defined(PJ_WIN32) && PJ_WIN32!=0) || \ (defined(PJ_WIN64) && PJ_WIN64!=0) info->def_devname = "0"; #elif defined(PJ_LINUX) && PJ_LINUX!=0 info->def_devname = "/dev/video0"; #endif /* Set supported formats, currently hardcoded to RGB24 only */ info->base.caps = PJMEDIA_VID_DEV_CAP_FORMAT; info->base.fmt_cnt = 1; for (i = 0; i < info->base.fmt_cnt; ++i) { pjmedia_format *fmt = &info->base.fmt[i]; fmt->id = PJMEDIA_FORMAT_RGB24; fmt->type = PJMEDIA_TYPE_VIDEO; fmt->detail_type = PJMEDIA_FORMAT_DETAIL_NONE; } } p = av_iformat_next(p); } return PJ_SUCCESS; }
AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) { AVProbeData lpd = *pd; AVInputFormat *fmt1 = NULL, *fmt; int score, id3 = 0; if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) { int id3len = ff_id3v2_tag_len(lpd.buf); if (lpd.buf_size > id3len + 16) { lpd.buf += id3len; lpd.buf_size -= id3len; } id3 = 1; } fmt = NULL; while ((fmt1 = av_iformat_next(fmt1))) { if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) continue; score = 0; if (fmt1->read_probe) { score = fmt1->read_probe(&lpd); } else if (fmt1->extensions) { if (av_match_ext(lpd.filename, fmt1->extensions)) score = AVPROBE_SCORE_EXTENSION; } if (av_match_name(lpd.mime_type, fmt1->mime_type)) score = FFMAX(score, AVPROBE_SCORE_EXTENSION); if (score > *score_max) { *score_max = score; fmt = fmt1; } else if (score == *score_max) fmt = NULL; } // A hack for files with huge id3v2 tags -- try to guess by file extension. if (!fmt && is_opened && *score_max < AVPROBE_SCORE_EXTENSION / 2) { while ((fmt = av_iformat_next(fmt))) if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) { *score_max = AVPROBE_SCORE_EXTENSION / 2; break; } } if (!fmt && id3 && *score_max < AVPROBE_SCORE_EXTENSION / 2 - 1) { while ((fmt = av_iformat_next(fmt))) if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) { *score_max = AVPROBE_SCORE_EXTENSION / 2 - 1; break; } } return fmt; }
static const AVOption *opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags) { AVFormatContext *s = obj; AVInputFormat *ifmt = NULL; AVOutputFormat *ofmt = NULL; if (s->priv_data) { if ((s->iformat && !s->iformat->priv_class) || (s->oformat && !s->oformat->priv_class)) return NULL; return av_opt_find(s->priv_data, name, unit, opt_flags, search_flags); } while ((ifmt = av_iformat_next(ifmt))) { const AVOption *o; if (ifmt->priv_class && (o = av_opt_find(&ifmt->priv_class, name, unit, opt_flags, search_flags))) return o; } while ((ofmt = av_oformat_next(ofmt))) { const AVOption *o; if (ofmt->priv_class && (o = av_opt_find(&ofmt->priv_class, name, unit, opt_flags, search_flags))) return o; } return NULL; }
static void probe(AVProbeData *pd, int type, int p, int size) { int i = 0; AVInputFormat *fmt = NULL; while ((fmt = av_iformat_next(fmt))) { if (fmt->flags & AVFMT_NOFILE) continue; if (fmt->read_probe && (!single_format || !strcmp(single_format, fmt->name)) ) { int score; int64_t start = AV_READ_TIME(); score = fmt->read_probe(pd); time_array[i] += AV_READ_TIME() - start; if (score > score_array[i] && score > AVPROBE_SCORE_MAX / 4) { score_array[i] = score; fprintf(stderr, "Failure of %s probing code with score=%d type=%d p=%X size=%d\n", fmt->name, score, type, p, size); failures++; } } i++; } }
QList<QString> SoundSourceFFmpeg::supportedFileExtensions() { QList<QString> list; AVInputFormat *l_SInputFmt = NULL; while ((l_SInputFmt = av_iformat_next(l_SInputFmt))) { if (l_SInputFmt->name == NULL) { break; } if (!strcmp(l_SInputFmt->name, "flac")) { list.append("flac"); } else if (!strcmp(l_SInputFmt->name, "ogg")) { list.append("ogg"); } else if (!strcmp(l_SInputFmt->name, "mov,mp4,m4a,3gp,3g2,mj2")) { list.append("m4a"); } else if (!strcmp(l_SInputFmt->name, "mp4")) { list.append("mp4"); } else if (!strcmp(l_SInputFmt->name, "mp3")) { list.append("mp3"); } else if (!strcmp(l_SInputFmt->name, "aac")) { list.append("aac"); } else if (!strcmp(l_SInputFmt->name, "opus") || !strcmp(l_SInputFmt->name, "libopus")) { list.append("opus"); } else if (!strcmp(l_SInputFmt->name, "wma")) { list.append("wma"); } } return list; }
QStringList SoundSourceProviderFFmpeg::getSupportedFileExtensions() const { QStringList list; AVInputFormat *l_SInputFmt = nullptr; while ((l_SInputFmt = av_iformat_next(l_SInputFmt))) { if (l_SInputFmt->name == nullptr) { break; // exit loop } qDebug() << "FFmpeg input format:" << l_SInputFmt->name; if (!strcmp(l_SInputFmt->name, "flac")) { list.append("flac"); } else if (!strcmp(l_SInputFmt->name, "ogg")) { list.append("ogg"); } else if (!strcmp(l_SInputFmt->name, "mov,mp4,m4a,3gp,3g2,mj2")) { list.append("m4a"); list.append("mp4"); } else if (!strcmp(l_SInputFmt->name, "mp4")) { list.append("mp4"); } else if (!strcmp(l_SInputFmt->name, "mp3")) { list.append("mp3"); } else if (!strcmp(l_SInputFmt->name, "aac")) { list.append("aac"); } else if (!strcmp(l_SInputFmt->name, "opus") || !strcmp(l_SInputFmt->name, "libopus")) { list.append("opus"); } else if (!strcmp(l_SInputFmt->name, "wma") or !strcmp(l_SInputFmt->name, "xwma")) { list.append("wma"); } } return list; }
AVInputFormat * internel_decoder::init_v4l(char *url){ AVInputFormat *format = NULL; char *p; //char *path; p = strchr(url,':'); if(p == NULL) return NULL; int len = strlen(url); int loc = p - url; char path[len - loc]; if(url[loc + 1] == '/' && url[loc+2] == '/' && url[loc+3] == '/'){ //path = new char[len - loc]; memcpy (path,p+3,len - loc); path[len - loc] = '\0'; cout <<path<<endl; while (format = av_iformat_next(format)){ cout <<" - "<<format->name<<" - "<<endl; if(strcmp(format->name,"video4linux2,v4l2")==0) break; } strcpy(url,path); }else{ cout <<"Illegal V4l URL..."<<endl; return NULL; } return format; }
AVInputFormat *av_find_input_format(const char *short_name) { AVInputFormat *fmt = NULL; while ((fmt = av_iformat_next(fmt))) if (av_match_name(short_name, fmt->name)) return fmt; return NULL; }
AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret) { AVProbeData lpd = *pd; AVInputFormat *fmt1 = NULL, *fmt; int score, nodat = 0, score_max = 0; const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE]; if (!lpd.buf) lpd.buf = zerobuffer; if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) { int id3len = ff_id3v2_tag_len(lpd.buf); if (lpd.buf_size > id3len + 16) { lpd.buf += id3len; lpd.buf_size -= id3len; } else if (id3len >= PROBE_BUF_MAX) { nodat = 2; } else nodat = 1; } fmt = NULL; while ((fmt1 = av_iformat_next(fmt1))) { if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) continue; score = 0; if (fmt1->read_probe) { score = fmt1->read_probe(&lpd); if (fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions)) { if (nodat == 0) score = FFMAX(score, 1); else if (nodat == 1) score = FFMAX(score, AVPROBE_SCORE_EXTENSION / 2 - 1); else score = FFMAX(score, AVPROBE_SCORE_EXTENSION); } } else if (fmt1->extensions) { if (av_match_ext(lpd.filename, fmt1->extensions)) score = AVPROBE_SCORE_EXTENSION; } #if FF_API_PROBE_MIME if (av_match_name(lpd.mime_type, fmt1->mime_type)) score = FFMAX(score, AVPROBE_SCORE_EXTENSION); #endif if (score > score_max) { score_max = score; fmt = fmt1; } else if (score == score_max) fmt = NULL; } if (nodat == 1) score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max); *score_ret = score_max; return fmt; }
int32_t DemuxerFormat::getNumFormats() { Global::init(); int i = 0; for(AVInputFormat* f = 0; (f = av_iformat_next(f))!=0; ++i) ; return i; }
static const AVClass *format_child_class_next(const AVClass *prev) { AVInputFormat *ifmt = NULL; AVOutputFormat *ofmt = NULL; while (prev && (ifmt = av_iformat_next(ifmt))) if (ifmt->priv_class == prev) break; if ((prev && ifmt) || (!prev)) while (ifmt = av_iformat_next(ifmt)) if (ifmt->priv_class) return ifmt->priv_class; while (prev && (ofmt = av_oformat_next(ofmt))) if (ofmt->priv_class == prev) break; while (ofmt = av_oformat_next(ofmt)) if (ofmt->priv_class) return ofmt->priv_class; return NULL; }
static struct AVInputFormat *ijkav_find_input_format(const char *iformat_name) { AVInputFormat *fmt = NULL; if (!iformat_name) return NULL; while ((fmt = av_iformat_next(fmt))) { if (!fmt->name) continue; if (!strcmp(iformat_name, fmt->name)) return fmt; } return NULL; }
DemuxerFormat* DemuxerFormat::getFormat(int32_t index) { Global::init(); int i = 0; for(AVInputFormat* f = 0; (f = av_iformat_next(f))!=0; ++i) if (i == index) { DemuxerFormat * retval = DemuxerFormat::make(f); return retval; } return 0; }
int opt_formats(const char *opt, const char *arg) { AVInputFormat *ifmt=NULL; AVOutputFormat *ofmt=NULL; const char *last_name; printf( "File formats:\n" " D. = Demuxing supported\n" " .E = Muxing supported\n" " --\n"); last_name= "000"; for(;;){ int decode=0; int encode=0; const char *name=NULL; const char *long_name=NULL; while((ofmt= av_oformat_next(ofmt))) { if((name == NULL || strcmp(ofmt->name, name)<0) && strcmp(ofmt->name, last_name)>0){ name= ofmt->name; long_name= ofmt->long_name; encode=1; } } while((ifmt= av_iformat_next(ifmt))) { if((name == NULL || strcmp(ifmt->name, name)<0) && strcmp(ifmt->name, last_name)>0){ name= ifmt->name; long_name= ifmt->long_name; encode=0; } if(name && strcmp(ifmt->name, name)==0) decode=1; } if(name==NULL) break; last_name= name; printf( " %s%s %-15s %s\n", decode ? "D":" ", encode ? "E":" ", name, long_name ? long_name:" "); } return 0; }
static void print_times(void) { int i = 0; AVInputFormat *fmt = NULL; while ((fmt = av_iformat_next(fmt))) { if (fmt->flags & AVFMT_NOFILE) continue; if (time_array[i] > 1000000) { fprintf(stderr, "%12"PRIu64" cycles, %12s\n", time_array[i], fmt->name); } i++; } }
const std::list<Demuxer::DemuxerInfo>& Demuxer::getAvailableDemuxers() { AVInputFormat* demuxer = nullptr; loadFFmpeg(); if (g_availableDemuxers.empty()) { while (nullptr != (demuxer = av_iformat_next(demuxer))) { DemuxerInfo info = { std::string(demuxer->name), std::string(demuxer->long_name) }; g_availableDemuxers.push_back(info); } } return g_availableDemuxers; }
/** * com.leixiaohua1020.sffmpegandroidhelloworld.MainActivity.avformatinfo() * AVFormat Support Information */ JNIEXPORT jstring Java_com_leixiaohua1020_sffmpegandroidhelloworld_MainActivity_avformatinfo(JNIEnv *env, jobject obj){ char info[40000] = { 0 }; av_register_all(); AVInputFormat *if_temp = av_iformat_next(NULL); AVOutputFormat *of_temp = av_oformat_next(NULL); //Input while(if_temp!=NULL){ sprintf(info, "%s[In ][%10s]\n", info, if_temp->name); if_temp=if_temp->next; } //Output while (of_temp != NULL){ sprintf(info, "%s[Out][%10s]\n", info, of_temp->name); of_temp = of_temp->next; } //LOGE("%s", info); return (*env)->NewStringUTF(env, info); }
static void *av_device_next(void *prev, int output, AVClassCategory c1, AVClassCategory c2) { const AVClass *pc; AVClassCategory category = AV_CLASS_CATEGORY_NA; do { if (output) { if (!(prev = av_oformat_next(prev))) break; pc = ((AVOutputFormat *)prev)->priv_class; } else { if (!(prev = av_iformat_next(prev))) break; pc = ((AVInputFormat *)prev)->priv_class; } if (!pc) continue; category = pc->category; } while (category != c1 && category != c2); return prev; }
JNIEXPORT jstring JNICALL Java_com_pl_asndktest_jni_NdkTest_avformatinfo (JNIEnv * env, jobject thiz) { char info[40000] = { 0 }; av_register_all(); AVInputFormat *if_temp = av_iformat_next(NULL); AVOutputFormat *of_temp = av_oformat_next(NULL); //Input while(if_temp!=NULL){ sprintf(info, "%s[In ][%10s]\n", info, if_temp->name); if_temp=if_temp->next; } //Output while (of_temp != NULL){ sprintf(info, "%s[Out][%10s]\n", info, of_temp->name); of_temp = of_temp->next; } //LOGE("%s", info); return (*env)->NewStringUTF(env, info); }
static mlt_properties avformat_metadata( mlt_service_type type, const char *id, void *data ) { char file[ PATH_MAX ]; const char *service_type = NULL; mlt_properties result = NULL; // Convert the service type to a string. switch ( type ) { case consumer_type: service_type = "consumer"; break; case filter_type: service_type = "filter"; break; case producer_type: service_type = "producer"; break; case transition_type: service_type = "transition"; break; default: return NULL; } // Load the yaml file snprintf( file, PATH_MAX, "%s/avformat/%s_%s.yml", mlt_environment( "MLT_DATA" ), service_type, id ); result = mlt_properties_parse_yaml( file ); if ( result && ( type == consumer_type || type == producer_type ) ) { // Annotate the yaml properties with AVOptions. mlt_properties params = (mlt_properties) mlt_properties_get_data( result, "parameters", NULL ); AVFormatContext *avformat = avformat_alloc_context(); #if LIBAVCODEC_VERSION_INT > ((53<<16)+(8<<8)+0) AVCodecContext *avcodec = avcodec_alloc_context3( NULL ); #else AVCodecContext *avcodec = avcodec_alloc_context(); #endif int flags = ( type == consumer_type )? AV_OPT_FLAG_ENCODING_PARAM : AV_OPT_FLAG_DECODING_PARAM; add_parameters( params, avformat, flags, NULL, NULL ); #if LIBAVFORMAT_VERSION_MAJOR >= 53 avformat_init(); if ( type == producer_type ) { AVInputFormat *f = NULL; while ( ( f = av_iformat_next( f ) ) ) if ( f->priv_class ) add_parameters( params, &f->priv_class, flags, NULL, f->name ); } else { AVOutputFormat *f = NULL; while ( ( f = av_oformat_next( f ) ) ) if ( f->priv_class ) add_parameters( params, &f->priv_class, flags, NULL, f->name ); } #endif add_parameters( params, avcodec, flags, NULL, NULL ); #if LIBAVCODEC_VERSION_MAJOR >= 53 AVCodec *c = NULL; while ( ( c = av_codec_next( c ) ) ) if ( c->priv_class ) add_parameters( params, &c->priv_class, flags, NULL, c->name ); #endif av_free( avformat ); av_free( avcodec ); } return result; }
mlt_producer producer_avformat_init( mlt_profile profile, char *file ) { int error = 0; // Report information about available demuxers and codecs as YAML Tiny if ( file && strstr( file, "f-list" ) ) { fprintf( stderr, "---\nformats:\n" ); AVInputFormat *format = NULL; while ( ( format = av_iformat_next( format ) ) ) fprintf( stderr, " - %s\n", format->name ); fprintf( stderr, "...\n" ); error = 1; } if ( file && strstr( file, "acodec-list" ) ) { fprintf( stderr, "---\naudio_codecs:\n" ); AVCodec *codec = NULL; while ( ( codec = av_codec_next( codec ) ) ) if ( codec->decode && codec->type == CODEC_TYPE_AUDIO ) fprintf( stderr, " - %s\n", codec->name ); fprintf( stderr, "...\n" ); error = 1; } if ( file && strstr( file, "vcodec-list" ) ) { fprintf( stderr, "---\nvideo_codecs:\n" ); AVCodec *codec = NULL; while ( ( codec = av_codec_next( codec ) ) ) if ( codec->decode && codec->type == CODEC_TYPE_VIDEO ) fprintf( stderr, " - %s\n", codec->name ); fprintf( stderr, "...\n" ); error = 1; } if ( error ) return NULL; mlt_producer this = NULL; // Check that we have a non-NULL argument if ( file != NULL ) { // Construct the producer this = calloc( 1, sizeof( struct mlt_producer_s ) ); // Initialise it if ( mlt_producer_init( this, NULL ) == 0 ) { // Get the properties mlt_properties properties = MLT_PRODUCER_PROPERTIES( this ); // Set the resource property (required for all producers) mlt_properties_set( properties, "resource", file ); // Register our get_frame implementation this->get_frame = producer_get_frame; // Open the file if ( producer_open( this, profile, file ) != 0 ) { // Clean up mlt_producer_close( this ); this = NULL; } else { // Close the file to release resources for large playlists - reopen later as needed mlt_properties_set_data( properties, "dummy_context", NULL, 0, NULL, NULL ); mlt_properties_set_data( properties, "audio_context", NULL, 0, NULL, NULL ); mlt_properties_set_data( properties, "video_context", NULL, 0, NULL, NULL ); // Default the user-selectable indices from the auto-detected indices mlt_properties_set_int( properties, "audio_index", mlt_properties_get_int( properties, "_audio_index" ) ); mlt_properties_set_int( properties, "video_index", mlt_properties_get_int( properties, "_video_index" ) ); } } } return this; }
AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret) { AVProbeData lpd = *pd; AVInputFormat *fmt1 = NULL, *fmt; int score, score_max = 0; const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE]; enum nodat { NO_ID3, ID3_ALMOST_GREATER_PROBE, ID3_GREATER_PROBE, ID3_GREATER_MAX_PROBE, } nodat = NO_ID3; if (!lpd.buf) lpd.buf = (unsigned char *) zerobuffer; if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) { int id3len = ff_id3v2_tag_len(lpd.buf); if (lpd.buf_size > id3len + 16) { if (lpd.buf_size < 2LL*id3len + 16) nodat = ID3_ALMOST_GREATER_PROBE; lpd.buf += id3len; lpd.buf_size -= id3len; } else if (id3len >= PROBE_BUF_MAX) { nodat = ID3_GREATER_MAX_PROBE; } else nodat = ID3_GREATER_PROBE; } fmt = NULL; while ((fmt1 = av_iformat_next(fmt1))) { if (!is_opened == !(fmt1->flags & AVFMT_NOFILE) && strcmp(fmt1->name, "image2")) continue; score = 0; if (fmt1->read_probe) { score = fmt1->read_probe(&lpd); if (score) av_log(NULL, AV_LOG_TRACE, "Probing %s score:%d size:%d\n", fmt1->name, score, lpd.buf_size); if (fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions)) { switch (nodat) { case NO_ID3: score = FFMAX(score, 1); break; case ID3_GREATER_PROBE: case ID3_ALMOST_GREATER_PROBE: score = FFMAX(score, AVPROBE_SCORE_EXTENSION / 2 - 1); break; case ID3_GREATER_MAX_PROBE: score = FFMAX(score, AVPROBE_SCORE_EXTENSION); break; } } } else if (fmt1->extensions) { if (av_match_ext(lpd.filename, fmt1->extensions)) score = AVPROBE_SCORE_EXTENSION; } if (av_match_name(lpd.mime_type, fmt1->mime_type)) { if (AVPROBE_SCORE_MIME > score) { av_log(NULL, AV_LOG_DEBUG, "Probing %s score:%d increased to %d due to MIME type\n", fmt1->name, score, AVPROBE_SCORE_MIME); score = AVPROBE_SCORE_MIME; } } if (score > score_max) { score_max = score; fmt = fmt1; } else if (score == score_max) { // if the conflict is between Myth MPEGTS demux and FFMPEG's origin // use mythtv's one if ((fmt1 == &ff_mpegts_demuxer && fmt == &ff_mythtv_mpegts_demuxer) || (fmt == &ff_mpegts_demuxer && fmt1 == &ff_mythtv_mpegts_demuxer)) { fmt = &ff_mythtv_mpegts_demuxer; } else if ((fmt1 == &ff_mpegts_demuxer && fmt == &ff_mythtv_mpegtsraw_demuxer) || (fmt == &ff_mpegts_demuxer && fmt1 == &ff_mythtv_mpegtsraw_demuxer)) { fmt = &ff_mythtv_mpegtsraw_demuxer; } else { fmt = NULL; } } } if (nodat == ID3_GREATER_PROBE) score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max); *score_ret = score_max; return fmt; }
static void list_formats(void) { AVInputFormat *fmt; mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf input formats:\n"); for (fmt = av_iformat_next(NULL); fmt; fmt = av_iformat_next(fmt)) mp_msg(MSGT_DEMUX, MSGL_INFO, "%15s : %s\n", fmt->name, fmt->long_name); }
int ff_img_read_header(AVFormatContext *s1) { VideoDemuxData *s = s1->priv_data; int first_index = 1, last_index = 1; AVStream *st; enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE; s1->ctx_flags |= AVFMTCTX_NOHEADER; st = avformat_new_stream(s1, NULL); if (!st) { return AVERROR(ENOMEM); } if (s->pixel_format && (pix_fmt = av_get_pix_fmt(s->pixel_format)) == AV_PIX_FMT_NONE) { av_log(s1, AV_LOG_ERROR, "No such pixel format: %s.\n", s->pixel_format); return AVERROR(EINVAL); } av_strlcpy(s->path, s1->filename, sizeof(s->path)); s->img_number = 0; s->img_count = 0; /* find format */ if (s1->iformat->flags & AVFMT_NOFILE) s->is_pipe = 0; else { s->is_pipe = 1; st->need_parsing = AVSTREAM_PARSE_FULL; } if (s->ts_from_file == 2) { #if !HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC av_log(s1, AV_LOG_ERROR, "POSIX.1-2008 not supported, nanosecond file timestamps unavailable\n"); return AVERROR(ENOSYS); #endif avpriv_set_pts_info(st, 64, 1, 1000000000); } else if (s->ts_from_file) avpriv_set_pts_info(st, 64, 1, 1); else avpriv_set_pts_info(st, 64, s->framerate.den, s->framerate.num); if (s->width && s->height) { st->codec->width = s->width; st->codec->height = s->height; } if (!s->is_pipe) { if (s->pattern_type == PT_DEFAULT) { if (s1->pb) { s->pattern_type = PT_NONE; } else s->pattern_type = PT_GLOB_SEQUENCE; } if (s->pattern_type == PT_GLOB_SEQUENCE) { s->use_glob = is_glob(s->path); if (s->use_glob) { #if HAVE_GLOB char *p = s->path, *q, *dup; int gerr; #endif av_log(s1, AV_LOG_WARNING, "Pattern type 'glob_sequence' is deprecated: " "use pattern_type 'glob' instead\n"); #if HAVE_GLOB dup = q = av_strdup(p); while (*q) { /* Do we have room for the next char and a \ insertion? */ if ((p - s->path) >= (sizeof(s->path) - 2)) break; if (*q == '%' && strspn(q + 1, "%*?[]{}")) ++q; else if (strspn(q, "\\*?[]{}")) *p++ = '\\'; *p++ = *q++; } *p = 0; av_free(dup); gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC, NULL, &s->globstate); if (gerr != 0) { return AVERROR(ENOENT); } first_index = 0; last_index = s->globstate.gl_pathc - 1; #endif } } if ((s->pattern_type == PT_GLOB_SEQUENCE && !s->use_glob) || s->pattern_type == PT_SEQUENCE) { if (find_image_range(s1->pb, &first_index, &last_index, s->path, s->start_number, s->start_number_range) < 0) { av_log(s1, AV_LOG_ERROR, "Could find no file with path '%s' and index in the range %d-%d\n", s->path, s->start_number, s->start_number + s->start_number_range - 1); return AVERROR(ENOENT); } } else if (s->pattern_type == PT_GLOB) { #if HAVE_GLOB int gerr; gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC, NULL, &s->globstate); if (gerr != 0) { return AVERROR(ENOENT); } first_index = 0; last_index = s->globstate.gl_pathc - 1; s->use_glob = 1; #else av_log(s1, AV_LOG_ERROR, "Pattern type 'glob' was selected but globbing " "is not supported by this libavformat build\n"); return AVERROR(ENOSYS); #endif } else if (s->pattern_type != PT_GLOB_SEQUENCE && s->pattern_type != PT_NONE) { av_log(s1, AV_LOG_ERROR, "Unknown value '%d' for pattern_type option\n", s->pattern_type); return AVERROR(EINVAL); } s->img_first = first_index; s->img_last = last_index; s->img_number = first_index; /* compute duration */ if (!s->ts_from_file) { st->start_time = 0; st->duration = last_index - first_index + 1; } } if (s1->video_codec_id) { st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = s1->video_codec_id; } else if (s1->audio_codec_id) { st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = s1->audio_codec_id; } else if (s1->iformat->raw_codec_id) { st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = s1->iformat->raw_codec_id; } else { const char *str = strrchr(s->path, '.'); s->split_planes = str && !av_strcasecmp(str + 1, "y"); st->codec->codec_type = AVMEDIA_TYPE_VIDEO; if (s1->pb) { int probe_buffer_size = 2048; uint8_t *probe_buffer = av_realloc(NULL, probe_buffer_size + AVPROBE_PADDING_SIZE); AVInputFormat *fmt = NULL; AVProbeData pd = { 0 }; if (!probe_buffer) return AVERROR(ENOMEM); probe_buffer_size = avio_read(s1->pb, probe_buffer, probe_buffer_size); if (probe_buffer_size < 0) { av_free(probe_buffer); return probe_buffer_size; } memset(probe_buffer + probe_buffer_size, 0, AVPROBE_PADDING_SIZE); pd.buf = probe_buffer; pd.buf_size = probe_buffer_size; pd.filename = s1->filename; while ((fmt = av_iformat_next(fmt))) { if (fmt->read_header != ff_img_read_header || !fmt->read_probe || (fmt->flags & AVFMT_NOFILE) || !fmt->raw_codec_id) continue; if (fmt->read_probe(&pd) > 0) { st->codec->codec_id = fmt->raw_codec_id; break; } } if (s1->flags & AVFMT_FLAG_CUSTOM_IO) { avio_seek(s1->pb, 0, SEEK_SET); } else ffio_rewind_with_probe_data(s1->pb, &probe_buffer, probe_buffer_size); } if (st->codec->codec_id == AV_CODEC_ID_NONE) st->codec->codec_id = ff_guess_image2_codec(s->path); if (st->codec->codec_id == AV_CODEC_ID_LJPEG) st->codec->codec_id = AV_CODEC_ID_MJPEG; if (st->codec->codec_id == AV_CODEC_ID_ALIAS_PIX) // we cannot distingiush this from BRENDER_PIX st->codec->codec_id = AV_CODEC_ID_NONE; } if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pix_fmt != AV_PIX_FMT_NONE) st->codec->pix_fmt = pix_fmt; return 0; }
void show_formats(void) { AVInputFormat *ifmt=NULL; AVOutputFormat *ofmt=NULL; URLProtocol *up=NULL; AVCodec *p=NULL, *p2; AVBitStreamFilter *bsf=NULL; const char *last_name; printf( "File formats:\n" " D. = Demuxing supported\n" " .E = Muxing supported\n" " --\n"); last_name= "000"; for(;;){ int decode=0; int encode=0; const char *name=NULL; const char *long_name=NULL; while((ofmt= av_oformat_next(ofmt))) { if((name == NULL || strcmp(ofmt->name, name)<0) && strcmp(ofmt->name, last_name)>0){ name= ofmt->name; long_name= ofmt->long_name; encode=1; } } while((ifmt= av_iformat_next(ifmt))) { if((name == NULL || strcmp(ifmt->name, name)<0) && strcmp(ifmt->name, last_name)>0){ name= ifmt->name; long_name= ifmt->long_name; encode=0; } if(name && strcmp(ifmt->name, name)==0) decode=1; } if(name==NULL) break; last_name= name; printf( " %s%s %-15s %s\n", decode ? "D":" ", encode ? "E":" ", name, long_name ? long_name:" "); } printf("\n"); 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" " ------\n"); last_name= "000"; for(;;){ int decode=0; int encode=0; int cap=0; const char *type_str; 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(p->decode) decode=1; if(p->encode) encode=1; cap |= p->capabilities; } } if(p2==NULL) break; last_name= p2->name; switch(p2->type) { case CODEC_TYPE_VIDEO: type_str = "V"; break; case CODEC_TYPE_AUDIO: type_str = "A"; break; case CODEC_TYPE_SUBTITLE: type_str = "S"; break; default: type_str = "?"; break; } printf( " %s%s%s%s%s%s %-15s %s", decode ? "D": (/*p2->decoder ? "d":*/" "), encode ? "E":" ", type_str, cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ", cap & CODEC_CAP_DR1 ? "D":" ", cap & CODEC_CAP_TRUNCATED ? "T":" ", p2->name, p2->long_name ? p2->long_name : ""); /* if(p2->decoder && decode==0) printf(" use %s for decoding", p2->decoder->name);*/ printf("\n"); } printf("\n"); printf("Bitstream filters:\n"); while((bsf = av_bitstream_filter_next(bsf))) printf(" %s", bsf->name); printf("\n"); printf("Supported file protocols:\n"); while((up = av_protocol_next(up))) printf(" %s:", up->name); printf("\n"); printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\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"); }