summaryrefslogtreecommitdiff
path: root/gtk2_ardour/transcode_ffmpeg.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-03-31 19:34:05 +0200
committerRobin Gareus <robin@gareus.org>2013-03-31 19:34:58 +0200
commitab3040f789b543602950ad30a9b9206abfa285a3 (patch)
tree69026af6ada7fbff87af57492009a1bdf060d5c6 /gtk2_ardour/transcode_ffmpeg.cc
parent6f78b824529a0ebbe51053930998cd8cbfefbf2e (diff)
vtl: ffmpeg interaction:
* use ardour/SRC to resample audio on import * parse framerate via codec-timebase if available * update encoder parameters * add vpx/webm as codec option
Diffstat (limited to 'gtk2_ardour/transcode_ffmpeg.cc')
-rw-r--r--gtk2_ardour/transcode_ffmpeg.cc54
1 files changed, 30 insertions, 24 deletions
diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc
index aeabd87a00..5ae9ae1c20 100644
--- a/gtk2_ardour/transcode_ffmpeg.cc
+++ b/gtk2_ardour/transcode_ffmpeg.cc
@@ -117,19 +117,20 @@ TranscodeFfmpeg::probe ()
std::vector<std::vector<std::string> > lines;
ParseCSV(ffoutput, lines);
+ double timebase = 0;
m_width = m_height = 0;
m_fps = m_aspect = 0;
m_duration = 0;
m_codec.clear();
m_audio.clear();
-#define PARSE_FRACTIONAL_FPS \
+#define PARSE_FRACTIONAL_FPS(VAR) \
{ \
std::string::size_type pos; \
- m_fps = atof(value.c_str()); \
+ VAR = atof(value.c_str()); \
pos = value.find_first_of('/'); \
if (pos != std::string::npos) { \
- m_fps = atof(value.substr(0, pos).c_str()) / atof(value.substr(pos+1).c_str()); \
+ VAR = atof(value.substr(0, pos).c_str()) / atof(value.substr(pos+1).c_str()); \
} \
}
@@ -160,9 +161,11 @@ TranscodeFfmpeg::probe ()
if (!m_codec.empty()) m_codec += " ";
m_codec += "(" + value + ")";
} else if (key == X_("r_frame_rate")) {
- PARSE_FRACTIONAL_FPS
- } else if (key == X_("time_base") && m_fps == 0) {
- PARSE_FRACTIONAL_FPS
+ PARSE_FRACTIONAL_FPS(m_fps)
+ } else if (key == X_("avg_frame_rate") && m_fps == 0) {
+ PARSE_FRACTIONAL_FPS(m_fps)
+ } else if (key == X_("time_base")) {
+ PARSE_FRACTIONAL_FPS(timebase)
} else if (key == X_("timecode") && m_duration == 0) {
int h,m,s; char f[7];
if (sscanf(i->at(16).c_str(), "%d:%d:%d:%s",&h,&m,&s,f) == 4) {
@@ -173,9 +176,9 @@ TranscodeFfmpeg::probe ()
+ atoi(f) / pow(10, strlen(f))
));
}
- } else if (key == X_("duration_ts")) {
- m_duration = atof(value.c_str());
- } else if (key == X_("duration") && m_duration == 0 && m_fps != 0) {
+ } else if (key == X_("duration_ts") && m_fps == 0 && timebase !=0 ) {
+ m_duration = atof(value.c_str()) * m_fps * timebase;
+ } else if (key == X_("duration") && m_fps != 0 && m_duration == 0) {
m_duration = atof(value.c_str()) * m_fps;
} else if (key == X_("display_aspect_ratio")) {
std::string::size_type pos;
@@ -357,23 +360,26 @@ TranscodeFfmpeg::extract_audio (std::string outfile, ARDOUR::framecnt_t samplera
if (stream >= m_audio.size()) return false;
char **argp;
+ int i = 0;
argp=(char**) calloc(15,sizeof(char*));
- argp[0] = strdup(ffmpeg_exe.c_str());
- argp[1] = strdup("-i");
- argp[2] = strdup(infile.c_str());
- argp[3] = strdup("-ar");
- argp[4] = (char*) calloc(7,sizeof(char)); snprintf(argp[4], 7, "%"PRId64, samplerate);
- argp[5] = strdup("-ac");
- argp[6] = (char*) calloc(3,sizeof(char)); snprintf(argp[6], 3, "%i", m_audio.at(stream).channels);
- argp[7] = strdup("-map");
- argp[8] = (char*) calloc(8,sizeof(char)); snprintf(argp[8], 8, "0:%s", m_audio.at(stream).stream_id.c_str());
- argp[9] = strdup("-vn");
- argp[10] = strdup("-acodec");
- argp[11] = strdup("pcm_f32le");
- argp[12] = strdup("-y");
- argp[13] = strdup(outfile.c_str());
- argp[14] = (char *)0;
+ argp[i++] = strdup(ffmpeg_exe.c_str());
+ argp[i++] = strdup("-i");
+ argp[i++] = strdup(infile.c_str());
+#if 0 // native samplerate -- use a3/SRC
+ argp[i++] = strdup("-ar");
+ argp[i] = (char*) calloc(7,sizeof(char)); snprintf(argp[i++], 7, "%"PRId64, samplerate);
+#endif
+ argp[i++] = strdup("-ac");
+ argp[i] = (char*) calloc(3,sizeof(char)); snprintf(argp[i++], 3, "%i", m_audio.at(stream).channels);
+ argp[i++] = strdup("-map");
+ argp[i] = (char*) calloc(8,sizeof(char)); snprintf(argp[i++], 8, "0:%s", m_audio.at(stream).stream_id.c_str());
+ argp[i++] = strdup("-vn");
+ argp[i++] = strdup("-acodec");
+ argp[i++] = strdup("pcm_f32le");
+ argp[i++] = strdup("-y");
+ argp[i++] = strdup(outfile.c_str());
+ argp[i++] = (char *)0;
/* Note: argp is free()d in ~SystemExec */
#if 1 /* DEBUG */
if (debug_enable) { /* tentative debug mode */