mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-04 13:53:26 +00:00
libopenmpt: add subsong support
Signed-off-by: Josh de Kock <josh@itanimul.li>
This commit is contained in:
parent
120f34b6ac
commit
9134d2df5b
@ -36,6 +36,7 @@ typedef struct OpenMPTContext {
|
|||||||
/* options */
|
/* options */
|
||||||
int sample_rate;
|
int sample_rate;
|
||||||
int64_t layout;
|
int64_t layout;
|
||||||
|
int subsong;
|
||||||
} OpenMPTContext;
|
} OpenMPTContext;
|
||||||
|
|
||||||
#define OFFSET(x) offsetof(OpenMPTContext, x)
|
#define OFFSET(x) offsetof(OpenMPTContext, x)
|
||||||
@ -44,6 +45,9 @@ typedef struct OpenMPTContext {
|
|||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
{ "sample_rate", "set sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, { .i64 = 48000 }, 1000, INT_MAX, A | D },
|
{ "sample_rate", "set sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, { .i64 = 48000 }, 1000, INT_MAX, A | D },
|
||||||
{ "layout", "set channel layout", OFFSET(layout), AV_OPT_TYPE_CHANNEL_LAYOUT, { .i64 = AV_CH_LAYOUT_STEREO }, 0, INT64_MAX, A | D },
|
{ "layout", "set channel layout", OFFSET(layout), AV_OPT_TYPE_CHANNEL_LAYOUT, { .i64 = AV_CH_LAYOUT_STEREO }, 0, INT64_MAX, A | D },
|
||||||
|
{ "subsong", "set subsong", OFFSET(subsong), AV_OPT_TYPE_INT, { .i64 = -2 }, -2, INT_MAX, A | D, "subsong"},
|
||||||
|
{ "all", "all", 0, AV_OPT_TYPE_CONST, { .i64 = -1}, 0, 0, A | D, "subsong" },
|
||||||
|
{ "auto", "auto", 0, AV_OPT_TYPE_CONST, { .i64 = -2}, 0, 0, A | D, "subsong" },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -70,6 +74,8 @@ static int read_header_openmpt(AVFormatContext *s)
|
|||||||
OpenMPTContext *openmpt = s->priv_data;
|
OpenMPTContext *openmpt = s->priv_data;
|
||||||
int64_t size = avio_size(s->pb);
|
int64_t size = avio_size(s->pb);
|
||||||
char *buf = av_malloc(size);
|
char *buf = av_malloc(size);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
@ -88,6 +94,24 @@ static int read_header_openmpt(AVFormatContext *s)
|
|||||||
add_meta(s, "encoder", openmpt_module_get_metadata(openmpt->module, "tracker"));
|
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, "comment", openmpt_module_get_metadata(openmpt->module, "message"));
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
st = avformat_new_stream(s, NULL);
|
st = avformat_new_stream(s, NULL);
|
||||||
if (!st) {
|
if (!st) {
|
||||||
openmpt_module_destroy(openmpt->module);
|
openmpt_module_destroy(openmpt->module);
|
||||||
|
Loading…
Reference in New Issue
Block a user