renamed rate to samplerate.
[swftools.git] / avi2swf / v2swf.c
index c56ff4b..2caed7b 100644 (file)
@@ -60,6 +60,7 @@ typedef struct _v2swf_internal_t
     float fpspos;
 
     int bitrate;
+    int samplerate;
 
     int finished;
     int keyframe;
@@ -118,6 +119,12 @@ static void msg(char*format, ...)
     fflush(stdout);
 }
 
+extern int swf_mp3_in_samplerate;
+extern int swf_mp3_out_samplerate;
+extern int swf_mp3_channels;
+extern int swf_mp3_bitrate;
+
+
 static void writeShape(v2swf_internal_t*i, int id, int gfxid, int width, int height)
 {
     RGBA rgb;
@@ -161,7 +168,7 @@ static void writeShape(v2swf_internal_t*i, int id, int gfxid, int width, int hei
 static int getSamples(videoreader_t*video, S16*data, int len, double speedup)
 {
     double pos = 0;
-    double ratio = video->rate * speedup / 44100.0;
+    double ratio = (double) video->samplerate * speedup / swf_mp3_in_samplerate;
     int rlen = (int)(len * ratio);
     int t;
     S16 tmp[576*32];
@@ -180,7 +187,7 @@ static int getSamples(videoreader_t*video, S16*data, int len, double speedup)
        tmp[t] = a/video->channels;
     }
 
-    /* down/up-sample to 44khz */
+    /* down/up-sample to the desired input samplerate (swf_mp3_in_samplerate) */
     for(t=0;t<len;t++) {
        data[t] = tmp[(int)pos];
        pos+=ratio;
@@ -188,9 +195,6 @@ static int getSamples(videoreader_t*video, S16*data, int len, double speedup)
     return 1;
 }
 
-extern int swf_mp3_channels;
-extern int swf_mp3_bitrate;
-extern int swf_mp3_samplerate;
 static void writeAudioForOneFrame(v2swf_internal_t* i)
 {
     int blocksize; 
@@ -205,11 +209,11 @@ static void writeAudioForOneFrame(v2swf_internal_t* i)
 
     msg("writeAudioForOneFrame()");
 
-    if(i->video->channels<=0 || i->video->rate<=0)
+    if(i->video->channels<=0 || i->video->samplerate<=0)
        return; /* no sound in video */
 
-    blocksize = 576; /* 11khz samples per mp3 block */
-    blockspersecond = 11025.0/blocksize;
+    blocksize = (i->samplerate > 22050) ? 1152 : 576;
+    blockspersecond = ((double)i->samplerate)/blocksize;
 
     /* notice: for framerates greater than about 35, audio starts getting choppy. */
     framespersecond = i->framerate;
@@ -221,6 +225,12 @@ static void writeAudioForOneFrame(v2swf_internal_t* i)
     msg("samplesperblock: %f", samplesperblock);
 
     if(!i->soundstreamhead) {
+       swf_mp3_out_samplerate = i->samplerate;
+       /* The pre-processing of sound samples in getSamples(..) above
+          re-samples the sound to swf_mp3_in_samplerate. It is best to
+          simply make it the original samplerate:  */
+       swf_mp3_in_samplerate = i->video->samplerate;
+
        /* first run - initialize */
        swf_mp3_channels = 1;//i->video->channels;
        swf_mp3_bitrate = i->bitrate;
@@ -257,8 +267,8 @@ static void writeAudioForOneFrame(v2swf_internal_t* i)
 
     /* write num frames, max 1 block */
     for(pos=0;pos<num;pos++) {
-       if(!getSamples(i->video, block1, 576*4, speedup)) { /* 4 = 44100/11025 */
-           i->video->rate = i->video->channels = 0; //end of soundtrack
+        if(!getSamples(i->video, block1, blocksize * (double)swf_mp3_in_samplerate/swf_mp3_out_samplerate, speedup)) {
+           i->video->samplerate = i->video->channels = 0; //end of soundtrack
            return;
        }
        if(!pos) {
@@ -574,18 +584,16 @@ static int encodeoneframe(v2swf_internal_t*i)
        return 0;
     }
 
-    i->fpspos += i->fpsratio;
-
-    /* skip frames */
-    if(i->fpspos<1.0) {
-       return 0;
-    }
-    
     msg("encoding image for frame %d\n", i->frames);
-
-    if(i->showframe)
+    if(i->showframe) {
+       i->fpspos += i->fpsratio;
+       /* skip frames */
+       if(i->fpspos<1.0) {
+           return 0;
+       }
        writeShowFrame(i);
-
+    }
+    
     msg("scaling\n");
 
     scaleimage(i);
@@ -781,13 +789,14 @@ int v2swf_init(v2swf_t*v2swf, videoreader_t * video)
     i->keyframe_interval = 8;
     i->quality = 20;
     i->scale = 65536;
+    i->samplerate = 11025;
     i->prescale = 0;
     i->head_done = 0;
     i->diffmode = DIFFMODE_QMEAN;
     i->audio_fix = 1.0;
     i->fixheader = 0;
     i->framerate = video->fps;
-    i->fpsratio = 1.00000000;
+    i->fpsratio = 1.00000000000;
     i->fpspos = 0.0;
     i->bitrate = 32;
     i->version = 6;
@@ -875,6 +884,8 @@ void v2swf_setparameter(v2swf_t*v2swf, char*name, char*value)
        i->blockdiff = atoi(value);
     } else if(!strcmp(name, "fixheader")) {
        i->fixheader = atoi(value);
+    } else if(!strcmp(name, "samplerate")) {
+       i->samplerate = atoi(value);
     } else if(!strcmp(name, "framerate")) {
        i->framerate = atof(value);
        i->fpsratio = i->framerate / i->video->fps;
@@ -959,29 +970,6 @@ void v2swf_backpatch(v2swf_t*v2swf, char*filename)
     }
 }
 
-float v2swf_getprogress(v2swf_t*v2swf)
-{
-    float* p;
-    v2swf_internal_t* i;
-    msg("v2swf_getprogress()");
-    if(!v2swf || !v2swf->internal) {
-       return 0.0;
-    }
-    i = (v2swf_internal_t*)v2swf->internal;
-
-    p = (float*)videoreader_getinfo(i->video, "position");
-
-    if(p) {
-       return *p;
-    } else {
-       float f = i->frames/1500.0; /*fake*/
-       if(f>1.0)
-           return 1.0;
-       else
-           return f;
-    }
-}
-
 void v2swf_setvideoparameter(videoreader_t*v, char*name, char*value)
 {
     msg("v2swf_setvideoparameter()");