static int query_formats(AVFilterContext *ctx) { static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P, AV_NE( AV_PIX_FMT_YUV420P9BE, AV_PIX_FMT_YUV420P9LE ), AV_NE( AV_PIX_FMT_YUV422P9BE, AV_PIX_FMT_YUV422P9LE ), AV_NE( AV_PIX_FMT_YUV444P9BE, AV_PIX_FMT_YUV444P9LE ), AV_NE( AV_PIX_FMT_YUV420P10BE, AV_PIX_FMT_YUV420P10LE ), AV_NE( AV_PIX_FMT_YUV422P10BE, AV_PIX_FMT_YUV422P10LE ), AV_NE( AV_PIX_FMT_YUV444P10BE, AV_PIX_FMT_YUV444P10LE ), AV_NE( AV_PIX_FMT_YUV420P16BE, AV_PIX_FMT_YUV420P16LE ), AV_NE( AV_PIX_FMT_YUV422P16BE, AV_PIX_FMT_YUV422P16LE ), AV_NE( AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUV444P16LE ), AV_PIX_FMT_NONE }; ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); return 0; }
static int get_format_from_sample_fmt(const char **fmt, enum AVSampleFormat sample_fmt) { int i; struct sample_fmt_entry { enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le; } sample_fmt_entries[] = { { AV_SAMPLE_FMT_U8, "u8", "u8" }, { AV_SAMPLE_FMT_S16, "s16be", "s16le" }, { AV_SAMPLE_FMT_S32, "s32be", "s32le" }, { AV_SAMPLE_FMT_FLT, "f32be", "f32le" }, { AV_SAMPLE_FMT_DBL, "f64be", "f64le" }, }; *fmt = NULL; for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) { struct sample_fmt_entry *entry = &sample_fmt_entries[i]; if (sample_fmt == entry->sample_fmt) { *fmt = AV_NE(entry->fmt_be, entry->fmt_le); return 0; } } fprintf(stderr, "Sample format %s not supported as output format\n", av_get_sample_fmt_name(sample_fmt)); return AVERROR(EINVAL); }
static int read_header_gme(AVFormatContext *s) { AVStream *st; AVIOContext *pb = s->pb; GMEContext *gme = s->priv_data; int64_t sz = avio_size(pb); char *buf; char dummy; if (sz < 0) { av_log(s, AV_LOG_WARNING, "Could not determine file size\n"); sz = gme->max_size; } else if (gme->max_size && sz > gme->max_size) { sz = gme->max_size; } buf = av_malloc(sz); if (!buf) return AVERROR(ENOMEM); sz = avio_read(pb, buf, sz); // Data left means our buffer (the max_size option) is too small if (avio_read(pb, &dummy, 1) == 1) { av_log(s, AV_LOG_ERROR, "File size is larger than max_size option " "value %"PRIi64", consider increasing the max_size option\n", gme->max_size); return AVERROR_BUFFER_TOO_SMALL; } if (gme_open_data(buf, sz, &gme->music_emu, gme->sample_rate)) { av_freep(&buf); return AVERROR_INVALIDDATA; } av_freep(&buf); if (gme_track_info(gme->music_emu, &gme->info, gme->track_index)) return AVERROR_STREAM_NOT_FOUND; if (gme_start_track(gme->music_emu, gme->track_index)) return AVERROR_UNKNOWN; load_metadata(s); st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); avpriv_set_pts_info(st, 64, 1, 1000); if (st->duration > 0) st->duration = gme->info->length; st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->codec_id = AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE); st->codecpar->channels = 2; st->codecpar->sample_rate = gme->sample_rate; return 0; }
NULL, CODEC_ID_PCM_F32LE) PCMDEF(s32be, "PCM signed 32 bit big-endian format", NULL, CODEC_ID_PCM_S32BE) PCMDEF(s32le, "PCM signed 32 bit little-endian format", NULL, CODEC_ID_PCM_S32LE) PCMDEF(s24be, "PCM signed 24 bit big-endian format", NULL, CODEC_ID_PCM_S24BE) PCMDEF(s24le, "PCM signed 24 bit little-endian format", NULL, CODEC_ID_PCM_S24LE) PCMDEF(s16be, "PCM signed 16 bit big-endian format", AV_NE("sw", NULL), CODEC_ID_PCM_S16BE) PCMDEF(s16le, "PCM signed 16 bit little-endian format", AV_NE(NULL, "sw"), CODEC_ID_PCM_S16LE) PCMDEF(s8, "PCM signed 8 bit format", "sb", CODEC_ID_PCM_S8) PCMDEF(u32be, "PCM unsigned 32 bit big-endian format", NULL, CODEC_ID_PCM_U32BE) PCMDEF(u32le, "PCM unsigned 32 bit little-endian format", NULL, CODEC_ID_PCM_U32LE) PCMDEF(u24be, "PCM unsigned 24 bit big-endian format", NULL, CODEC_ID_PCM_U24BE)
.read_close = audio_read_close, .flags = AVFMT_NOFILE, .priv_class = &oss_demuxer_class, }; #endif #if CONFIG_OSS_OUTDEV static const AVClass oss_muxer_class = { .class_name = "OSS muxer", .item_name = av_default_item_name, .version = LIBAVUTIL_VERSION_INT, .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, }; AVOutputFormat ff_oss_muxer = { .name = "oss", .long_name = NULL_IF_CONFIG_SMALL("OSS (Open Sound System) playback"), .priv_data_size = sizeof(AudioData), /* XXX: we make the assumption that the soundcard accepts this format */ /* XXX: find better solution with "preinit" method, needed also in other formats */ .audio_codec = AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE), .video_codec = AV_CODEC_ID_NONE, .write_header = audio_write_header, .write_packet = audio_write_packet, .write_trailer = audio_write_trailer, .flags = AVFMT_NOFILE, .priv_class = &oss_muxer_class, }; #endif
}; AVInputFormat ff_oss_demuxer = { .name = "oss", .long_name = NULL_IF_CONFIG_SMALL("Open Sound System capture"), .priv_data_size = sizeof(AudioData), .read_header = audio_read_header, .read_packet = audio_read_packet, .read_close = audio_read_close, .flags = AVFMT_NOFILE, .priv_class = &oss_demuxer_class, }; #endif #if CONFIG_OSS_OUTDEV AVOutputFormat ff_oss_muxer = { .name = "oss", .long_name = NULL_IF_CONFIG_SMALL("Open Sound System playback"), .priv_data_size = sizeof(AudioData), /* XXX: we make the assumption that the soundcard accepts this format */ /* XXX: find better solution with "preinit" method, needed also in other formats */ .audio_codec = AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE), .video_codec = CODEC_ID_NONE, .write_header = audio_write_header, .write_packet = audio_write_packet, .write_trailer = audio_write_trailer, .flags = AVFMT_NOFILE, }; #endif
static int read_header_openmpt(AVFormatContext *s) { AVStream *st; OpenMPTContext *openmpt = s->priv_data; int64_t size; char *buf; #if OPENMPT_API_VERSION_AT_LEAST(0,3,0) int error; #endif int ret; size = avio_size(s->pb); if (size <= 0) return AVERROR_INVALIDDATA; buf = av_malloc(size); if (!buf) return AVERROR(ENOMEM); size = avio_read(s->pb, buf, size); if (size < 0) { av_log(s, AV_LOG_ERROR, "Reading input buffer failed.\n"); av_freep(&buf); return size; } #if OPENMPT_API_VERSION_AT_LEAST(0,3,0) error = OPENMPT_ERROR_OK; openmpt->module = openmpt_module_create_from_memory2(buf, size, openmpt_logfunc, s, NULL, NULL, &error, NULL, NULL); av_freep(&buf); if (!openmpt->module) { if (error == OPENMPT_ERROR_OUT_OF_MEMORY) return AVERROR(ENOMEM); else if (error >= OPENMPT_ERROR_GENERAL) return AVERROR_INVALIDDATA; else return AVERROR_UNKNOWN; } #else openmpt->module = openmpt_module_create_from_memory(buf, size, openmpt_logfunc, s, NULL); av_freep(&buf); if (!openmpt->module) return AVERROR_INVALIDDATA; #endif openmpt->channels = av_get_channel_layout_nb_channels(openmpt->layout); if (openmpt->subsong >= openmpt_module_get_num_subsongs(openmpt->module)) { openmpt_module_destroy(openmpt->module); av_log(s, AV_LOG_ERROR, "Invalid subsong index: %d\n", openmpt->subsong); return AVERROR(EINVAL); } if (openmpt->subsong != -2) { if (openmpt->subsong >= 0) { av_dict_set_int(&s->metadata, "track", openmpt->subsong + 1, 0); } ret = openmpt_module_select_subsong(openmpt->module, openmpt->subsong); if (!ret){ openmpt_module_destroy(openmpt->module); av_log(s, AV_LOG_ERROR, "Could not select requested subsong: %d", openmpt->subsong); return AVERROR(EINVAL); } } openmpt->duration = openmpt_module_get_duration_seconds(openmpt->module); add_meta(s, "artist", openmpt_module_get_metadata(openmpt->module, "artist")); add_meta(s, "title", openmpt_module_get_metadata(openmpt->module, "title")); add_meta(s, "encoder", openmpt_module_get_metadata(openmpt->module, "tracker")); add_meta(s, "comment", openmpt_module_get_metadata(openmpt->module, "message")); add_meta(s, "date", openmpt_module_get_metadata(openmpt->module, "date")); st = avformat_new_stream(s, NULL); if (!st) { openmpt_module_destroy(openmpt->module); openmpt->module = NULL; return AVERROR(ENOMEM); } avpriv_set_pts_info(st, 64, 1, AV_TIME_BASE); st->duration = llrint(openmpt->duration*AV_TIME_BASE); st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->codec_id = AV_NE(AV_CODEC_ID_PCM_F32BE, AV_CODEC_ID_PCM_F32LE); st->codecpar->channels = openmpt->channels; st->codecpar->sample_rate = openmpt->sample_rate; return 0; }
"oss", NULL_IF_CONFIG_SMALL("Open Sound System capture"), sizeof(AudioData), NULL, audio_read_header, audio_read_packet, audio_read_close, .flags = AVFMT_NOFILE, .priv_class = &oss_demuxer_class, }; #endif #if CONFIG_OSS_OUTDEV AVOutputFormat ff_oss_muxer = { "oss", NULL_IF_CONFIG_SMALL("Open Sound System playback"), "", "", sizeof(AudioData), /* XXX: we make the assumption that the soundcard accepts this format */ /* XXX: find better solution with "preinit" method, needed also in other formats */ AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE), CODEC_ID_NONE, audio_write_header, audio_write_packet, audio_write_trailer, .flags = AVFMT_NOFILE, }; #endif