---
 libavformat/libopenmpt.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c
index 58a02be..670866f 100644
--- a/libavformat/libopenmpt.c
+++ b/libavformat/libopenmpt.c
@@ -36,14 +36,19 @@ typedef struct OpenMPTContext {
     /* options */
     int sample_rate;
     int64_t layout;
+    int subsong;
 } OpenMPTContext;
 
+
+#define LIBOPENMPT_SUBSONG_DEFAULT -2
+
 #define OFFSET(x) offsetof(OpenMPTContext, x)
 #define A AV_OPT_FLAG_AUDIO_PARAM
 #define D AV_OPT_FLAG_DECODING_PARAM
 static const AVOption options[] = {
-    {"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},
+    {"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},
+    {"subsong",     "set subsong",        OFFSET(subsong),     
AV_OPT_TYPE_INT,            {.i64 = LIBOPENMPT_SUBSONG_DEFAULT}, -2,   INT_MAX, 
  A|D},
     {NULL}
 };
 
@@ -88,6 +93,18 @@ static int read_header_openmpt(AVFormatContext *s)
     add_meta(s, "encoder", openmpt_module_get_metadata(openmpt->module, 
"tracker"));
     add_meta(s, "comment", openmpt_module_get_metadata(openmpt->module, 
"message"));
 
+    if (openmpt->subsong >= openmpt_module_get_num_subsongs(openmpt->module)) {
+        av_log(s, AV_LOG_ERROR, "Invalid subsong index: %d\n", 
openmpt->subsong);
+        return AVERROR(EINVAL);
+    }
+
+    if (openmpt->subsong != LIBOPENMPT_SUBSONG_DEFAULT) {
+        if (openmpt->subsong >= 0) {
+            av_dict_set_int(&s->metadata, "track", openmpt->subsong + 1, 0);
+        }
+        openmpt_module_select_subsong(openmpt->module, openmpt->subsong);
+    }
+
     st = avformat_new_stream(s, NULL);
     if (!st) {
         openmpt_module_destroy(openmpt->module);
-- 
2.7.4 (Apple Git-66)

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to