git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
brought up to date.
[swftools.git]
/
avi2swf
/
videoreader_vfw.cc
diff --git
a/avi2swf/videoreader_vfw.cc
b/avi2swf/videoreader_vfw.cc
index
ec05d13
..
2e0c787
100644
(file)
--- a/
avi2swf/videoreader_vfw.cc
+++ b/
avi2swf/videoreader_vfw.cc
@@
-19,12
+19,12
@@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+#include "videoreader.h"
#ifdef WIN32
#include <windows.h>
#include <vfw.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#include <vfw.h>
#include <stdlib.h>
#include <stdio.h>
-#include "videoreader.h"
typedef struct _videoreader_vfw_internal {
//video:
typedef struct _videoreader_vfw_internal {
//video:
@@
-49,13
+49,14
@@
typedef struct _videoreader_vfw_internal {
int samplerate;
int channels;
int samplerate;
int channels;
+ int flip;
} videoreader_vfw_internal_t;
static int avifile_initialized = 0;
#define _TRACE_ {printf("%s: %d (%s)\n",__FILE__,__LINE__,__func__);fflush(stdout);}
} videoreader_vfw_internal_t;
static int avifile_initialized = 0;
#define _TRACE_ {printf("%s: %d (%s)\n",__FILE__,__LINE__,__func__);fflush(stdout);}
-bool videoreader_vfw_eof(videoreader_t* vr)
+static bool videoreader_vfw_eof(videoreader_t* vr)
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
return (i->video_pos >= i->video_end);
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
return (i->video_pos >= i->video_end);
@@
-87,10
+88,15
@@
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
int bytesperpixel = ((bi->biWidth*bi->biBitCount)+7)&~7;
int linex = ((bytesperpixel/8)+3)&~3;
memset(dest, 255, dest_width*dest_height*4);//pre-fill alpha channel
int bytesperpixel = ((bi->biWidth*bi->biBitCount)+7)&~7;
int linex = ((bytesperpixel/8)+3)&~3;
memset(dest, 255, dest_width*dest_height*4);//pre-fill alpha channel
+
+ int starty = i->flip? 0 : dest_height-1;
+ int endy = i->flip? dest_height-1 : 0;
+ int yinc = i->flip? 1 : -1;
+
if(bi->biBitCount==1) {
if(bi->biBitCount==1) {
- int y;
UCHAR*img = data;
UCHAR*img = data;
- for(y=0;y<dest_height;y++) {
+ int y;
+ for(y=starty;y<=endy;y+=yinc) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
@@
-98,10
+104,10
@@
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
}
}
} else if(bi->biBitCount==4) {
}
}
} else if(bi->biBitCount==4) {
- int y;
UCHAR*img = &data[bi->biClrUsed*4];
UCHAR*pal = data;
UCHAR*img = &data[bi->biClrUsed*4];
UCHAR*pal = data;
- for(y=0;y<dest_height;y++) {
+ int y;
+ for(y=starty;y<=endy;y+=yinc) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width/2;x++) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width/2;x++) {
@@
-111,10
+117,10
@@
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
}
}
} else if(bi->biBitCount==8) {
}
}
} else if(bi->biBitCount==8) {
- int y;
UCHAR*img = &data[bi->biClrUsed*4];
UCHAR*pal = data;
UCHAR*img = &data[bi->biClrUsed*4];
UCHAR*pal = data;
- for(y=0;y<dest_height;y++) {
+ int y;
+ for(y=starty;y<=endy;y+=yinc) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
@@
-125,7
+131,7
@@
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
} else if(bi->biBitCount==24) {
UCHAR*img = data;
int y;
} else if(bi->biBitCount==24) {
UCHAR*img = data;
int y;
- for(y=0;y<dest_height;y++) {
+ for(y=starty;y<=endy;y+=yinc) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
@@
-136,7
+142,7
@@
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
} else if(bi->biBitCount==32) {
UCHAR*img = data;
int y;
} else if(bi->biBitCount==32) {
UCHAR*img = data;
int y;
- for(y=0;y<dest_height;y++) {
+ for(y=starty;y<=endy;y+=yinc) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
UCHAR*line = &img[linex*y];
int x;
for(x=0;x<dest_width;x++) {
@@
-151,7
+157,7
@@
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
return 1;
}
return 1;
}
-int videoreader_vfw_getimage(videoreader_t* vr, void*buffer)
+static int videoreader_vfw_getimage(videoreader_t* vr, void*buffer)
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
@@
-162,12
+168,12
@@
int videoreader_vfw_getimage(videoreader_t* vr, void*buffer)
bi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(i->getframe, i->video_pos);
i->video_pos++;
bi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(i->getframe, i->video_pos);
i->video_pos++;
+ vr->frame++;
if(!bi) {
fprintf(stderr, "AVIStreamGetFrame failed\n");
return 0;
}
if(!bi) {
fprintf(stderr, "AVIStreamGetFrame failed\n");
return 0;
}
- printf("%dx%d:%d\n", bi->biWidth, bi->biHeight, bi->biBitCount);
if(!bitmap_to_rgba(bi, buffer, i->width, i->height)) {
fprintf(stderr, "couldn't convert bitmap to RGBA.\n");
if(!bitmap_to_rgba(bi, buffer, i->width, i->height)) {
fprintf(stderr, "couldn't convert bitmap to RGBA.\n");
@@
-185,7
+191,7
@@
static int readAudioBlock(videoreader_vfw_internal_t* i, void*buf, int len)
return bytes;
}
return bytes;
}
-int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
+static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
@@
-215,7
+221,7
@@
int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
}
}
}
}
-void videoreader_vfw_close(videoreader_t* vr)
+static void videoreader_vfw_close(videoreader_t* vr)
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
@@
-233,7
+239,13
@@
void videoreader_vfw_close(videoreader_t* vr)
free(vr->internal); vr->internal = 0;
}
free(vr->internal); vr->internal = 0;
}
-void videoreader_vfw_setparameter(videoreader_t* vr, char*name, char*value) {}
+static void videoreader_vfw_setparameter(videoreader_t*vr, char*name, char*value)
+{
+ videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
+ if(!strcmp(name, "flip")) {
+ i->flip = atoi(value);
+ }
+}
int videoreader_vfw_open(videoreader_t* vr, char* filename)
{
int videoreader_vfw_open(videoreader_t* vr, char* filename)
{
@@
-279,28
+291,37
@@
int videoreader_vfw_open(videoreader_t* vr, char* filename)
/* video stream */
BITMAPINFOHEADER bitmap;
/* video stream */
BITMAPINFOHEADER bitmap;
- LONG size = sizeof(i->bitmap);
+ LONG size = sizeof(bitmap);
AVIStreamReadFormat(stream, 0, &bitmap, &size);
AVIStreamReadFormat(stream, 0, &bitmap, &size);
- if(i->bitmap.biCompression == 0/*RGB*/) {
+ if(1) {
i->bitmap = bitmap;
i->vs = stream;
i->width = bitmap.biWidth;
i->height = bitmap.biHeight;
i->bitmap = bitmap;
i->vs = stream;
i->width = bitmap.biWidth;
i->height = bitmap.biHeight;
+ } else {
+ fprintf(stderr, "Ignoring video stream: %dx%d compression=%d planes=%d\n",
+ bitmap.biWidth, bitmap.biHeight,
+ bitmap.biCompression,bitmap.biPlanes);
}
}
else if (streaminfo.fccType == streamtypeAUDIO) {
/* audio stream */
WAVEFORMATEX waveformat;
}
}
else if (streaminfo.fccType == streamtypeAUDIO) {
/* audio stream */
WAVEFORMATEX waveformat;
- LONG size = sizeof(i->waveformat);
+ LONG size = sizeof(waveformat);
AVIStreamReadFormat(stream, 0, &waveformat, &size);
AVIStreamReadFormat(stream, 0, &waveformat, &size);
- if(i->waveformat.wBitsPerSample == 16 || i->waveformat.wBitsPerSample == 8) {
+ if(waveformat.wBitsPerSample == 16 ||
+ waveformat.wBitsPerSample == 8 ||
+ waveformat.wBitsPerSample == 1
+ ) {
i->waveformat = waveformat;
i->as = stream;
i->waveformat = waveformat;
i->as = stream;
- i->channels = i->waveformat.nChannels;
- i->samplerate = i->waveformat.nSamplesPerSec;
+ i->channels = waveformat.nChannels;
+ i->samplerate = waveformat.nSamplesPerSec;
+ } else {
+ fprintf(stderr, "Ignoring audio stream: bitspersample=%d\n", waveformat.wBitsPerSample);
}
}
t++;
}
}
t++;
@@
-322,6
+343,7
@@
int videoreader_vfw_open(videoreader_t* vr, char* filename)
i->getframe = AVIStreamGetFrameOpen(i->vs, 0);
if(!i->getframe) {
i->getframe = AVIStreamGetFrameOpen(i->vs, 0);
if(!i->getframe) {
+ fprintf(stderr, "Couldn't initialize AVIStream for %s- codec missing?\n", filename);
return -1;
}
return -1;
}