Added GdkPixbuf image loader (jpeg,png,...) , changed VIMS 330 (screenshot), new VIMS 247 (open image), images can be added to the editlist with add video file, bugfix in Gveejay open file dialog, some other smaller fixes

git-svn-id: svn://code.dyne.org/veejay/trunk@351 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
Niels Elburg
2005-06-20 20:05:26 +00:00
parent 143fedfdf3
commit 3cadb7226c
20 changed files with 687 additions and 178 deletions

View File

@@ -31,7 +31,9 @@
#include <libel/lav_io.h>
//#include <veejay/vj-lib.h>
#include <libvjmsg/vj-common.h>
#ifdef USE_GDK_PIXBUF
#include <libel/pixbuf.h>
#endif
extern int AVI_errno;
static int _lav_io_default_chroma = CHROMAUNKNOWN;
static char video_format=' ';
@@ -52,6 +54,22 @@ static unsigned long jpeg_padded_len = 0;
static unsigned long jpeg_app0_offset = 0;
static unsigned long jpeg_app1_offset = 0;
#ifdef USE_GDK_PIXBUF
static int output_scale_width = 0;
static int output_scale_height = 0;
static float output_fps = 25.0;
static int output_yuv = 0; // 422
void lav_set_project(int w, int h, float f, int fmt)
{
output_scale_width = w;
output_scale_height = h;
output_fps = f;
output_yuv = fmt;
}
#endif
#define M_SOF0 0xC0
#define M_SOF1 0xC1
#define M_DHT 0xC4
@@ -244,6 +262,7 @@ int lav_query_polarity(char format)
case 'j': return LAV_INTER_TOP_FIRST;
case 'q': return LAV_INTER_TOP_FIRST;
case 'm': return LAV_INTER_TOP_FIRST;
case 'x': return LAV_NOT_INTERLACED; // picture is always not interlaced
default: return LAV_INTER_TOP_FIRST;
}
}
@@ -321,6 +340,7 @@ lav_file_t *lav_open_output_file(char *filename, char format,
if(asize) AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM);
return lav_fd;
}
if(lav_fd) free(lav_fd);
return NULL;
}
@@ -328,16 +348,27 @@ int lav_close(lav_file_t *lav_file)
{
int ret = 0;
video_format = lav_file->format; internal_error = 0; /* for error messages */
switch(video_format)
{
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
ret = rawdv_close(lav_file->dv_fd );
else
case 'b':
ret = rawdv_close(lav_file->dv_fd);
break;
#endif
ret = AVI_close( lav_file->avi_fd );
#ifdef USE_GDK_PIXBUF
case 'x':
vj_picture_cleanup( lav_file->picture );
ret = 1;
break;
#endif
default:
ret = AVI_close(lav_file->avi_fd);
break;
}
if(lav_file) free(lav_file);
if(lav_file) free(lav_file);
return 1;
return ret;
}
int lav_write_frame(lav_file_t *lav_file, uint8_t *buff, long size, long count)
@@ -352,7 +383,10 @@ int lav_write_frame(lav_file_t *lav_file, uint8_t *buff, long size, long count)
return -1;
#endif
/* For interlaced video insert the apropriate APPn markers */
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return -1;
#endif
if(lav_file->interlacing!=LAV_NOT_INTERLACED && (lav_file->format == 'a' || lav_file->format=='A'))
{
jpgdata = buff;
@@ -403,6 +437,10 @@ int lav_write_audio(lav_file_t *lav_file, uint8_t *buff, long samps)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return 0;
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 0;
#endif
return AVI_write_audio( lav_file->avi_fd, buff, samps*lav_file->bps);
}
@@ -415,6 +453,10 @@ long lav_video_frames(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_video_frames(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 2;
#endif
return AVI_video_frames(lav_file->avi_fd);
}
@@ -425,6 +467,10 @@ int lav_video_width(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format=='b')
return rawdv_width(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format=='x')
return (output_scale_width == 0 ? vj_picture_get_width( lav_file->picture ) : output_scale_width);
#endif
return AVI_video_width(lav_file->avi_fd);
}
@@ -435,6 +481,10 @@ int lav_video_height(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_height( lav_file->dv_fd );
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return (output_scale_height == 0 ? vj_picture_get_height( lav_file->picture ) : output_scale_height);
#endif
return AVI_video_height(lav_file->avi_fd);
}
@@ -445,6 +495,10 @@ double lav_frame_rate(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_fps(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return output_fps;
#endif
return AVI_frame_rate(lav_file->avi_fd);
}
@@ -454,6 +508,10 @@ int lav_video_interlacing(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_interlacing(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return LAV_NOT_INTERLACED;
#endif
return lav_file->interlacing;
}
@@ -479,6 +537,10 @@ int lav_video_compressor_type(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(lav_file->format == 'b')
return rawdv_compressor( lav_file->dv_fd );
#endif
#ifdef USE_GDK_PIXBUF
if(lav_file->format == 'x')
return 0xffff;
#endif
return AVI_video_compressor_type( lav_file->avi_fd );
}
@@ -492,6 +554,13 @@ const char *lav_video_compressor(lav_file_t *lav_file)
const char *tmp = (const char*) strdup("dvsd");
return tmp;
}
#endif
#ifdef USE_GDK_PIXBUF
if( video_format == 'x')
{
const char *tmp = (const char*) strdup("PICT");
return tmp;
}
#endif
return AVI_video_compressor(lav_file->avi_fd);
}
@@ -503,6 +572,10 @@ int lav_audio_channels(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_audio_channels(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 0;
#endif
return AVI_audio_channels(lav_file->avi_fd);
}
@@ -514,6 +587,10 @@ int lav_audio_bits(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_audio_bits(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x' )
return 0;
#endif
return (AVI_audio_bits(lav_file->avi_fd));
}
@@ -525,6 +602,10 @@ long lav_audio_rate(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format=='b')
return rawdv_audio_rate(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 0;
#endif
return (AVI_audio_rate(lav_file->avi_fd));
}
@@ -536,6 +617,10 @@ long lav_audio_clips(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format=='b')
return rawdv_audio_bps(lav_file->dv_fd);
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 0;
#endif
return (AVI_audio_bytes(lav_file->avi_fd)/lav_file->bps);
}
@@ -546,6 +631,10 @@ long lav_frame_size(lav_file_t *lav_file, long frame)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_frame_size( lav_file->dv_fd );
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 1;
#endif
return (AVI_frame_size(lav_file->avi_fd,frame));
}
@@ -556,6 +645,10 @@ int lav_seek_start(lav_file_t *lav_file)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_set_position( lav_file->dv_fd, 0 );
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 1;
#endif
return (AVI_seek_start(lav_file->avi_fd));
}
@@ -566,6 +659,10 @@ int lav_set_video_position(lav_file_t *lav_file, long frame)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_set_position( lav_file->dv_fd, frame );
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 1;
#endif
return (AVI_set_video_position(lav_file->avi_fd,frame));
}
@@ -573,28 +670,28 @@ int lav_set_video_position(lav_file_t *lav_file, long frame)
int lav_read_frame(lav_file_t *lav_file, uint8_t *vidbuf)
{
video_format = lav_file->format; internal_error = 0; /* for error messages */
#ifdef HAVE_MLT
if(lav_file->format == 't')
{
mlt_frame frame;
mlt_service_get_frame( mlt_producer( lav_file->producer ), &frame, 0);
mlt_properties_set(
mlt_frame_properties( frame ), "rescale.interp", "full");
mlt_frame_get_image( frame, &_tmp_buffer, lav_file->iformat, lav_file->out_width,
lav_file->out_height , 0);
// convert to planar (mlt gives 422 packed)
// convert tmp_buffer to vidbuf , set flag as YUV 4:2:2 planar
}
#endif
#ifdef SUPPORT_READ_DV2
if(lav_file->format == 'b')
{
return rawdv_read_frame( lav_file->dv_fd, vidbuf );
}
#endif
#ifdef USE_GDK_PIXBUF
if(lav_file->format == 'x')
return -1;
#endif
return (AVI_read_frame(lav_file->avi_fd,vidbuf));
}
#ifdef USE_GDK_PIXBUF
uint8_t *lav_get_frame_ptr( lav_file_t *lav_file )
{
if(lav_file->format == 'x')
return vj_picture_get( lav_file->picture );
return NULL;
}
#endif
int lav_is_DV(lav_file_t *lav_file)
{
#ifdef SUPPORT_READ_DV2
@@ -611,6 +708,10 @@ int lav_set_audio_position(lav_file_t *lav_file, long clip)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return 0;
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 0;
#endif
return (AVI_set_audio_position(lav_file->avi_fd,clip*lav_file->bps));
}
@@ -625,6 +726,10 @@ long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps)
#ifdef SUPPORT_READ_DV2
if(video_format == 'b')
return rawdv_read_audio_frame( lav_file->dv_fd, audbuf );
#endif
#ifdef USE_GDK_PIXBUF
if(video_format == 'x')
return 0;
#endif
video_format = lav_file->format; internal_error = 0; /* for error messages */
return (AVI_read_audio(lav_file->avi_fd,audbuf,samps*lav_file->bps)/lav_file->bps);
@@ -653,6 +758,9 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size)
lav_fd->avi_fd = 0;
#ifdef SUPPORT_READ_DV2
lav_fd->dv_fd = 0;
#endif
#ifdef USE_GDK_PIXBUF
lav_fd->picture = NULL;
#endif
lav_fd->format = 0;
lav_fd->interlacing = LAV_INTER_UNKNOWN;
@@ -682,6 +790,21 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size)
}
else if( AVI_errno==AVI_ERR_NO_AVI )
{
int ret = 0;
#ifdef USE_GDK_PIXBUF
lav_fd->picture = vj_picture_open( (const char*) filename,
output_scale_width, output_scale_height, output_yuv );
if(lav_fd->picture)
{
lav_fd->format = 'x';
lav_fd->has_audio = 0;
video_comp = strdup( "PICT" );
ret = 1;
}
else
{
#endif
#ifdef SUPPORT_READ_DV2
lav_fd->dv_fd = rawdv_open_input_file(filename,mmap_size);
if(lav_fd->dv_fd)
@@ -690,23 +813,34 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size)
lav_fd->has_audio = 0;
//(rawdv_audio_bits(lav_fd->dv_fd) > 0 ? 1:0);
video_comp = rawdv_video_compressor( lav_fd->dv_fd );
ret = 1;
}
else
{
#endif
free(lav_fd);
internal_error = ERROR_FORMAT; /* Format not recognized */
veejay_msg(VEEJAY_MSG_ERROR, "Unable to identify file");
return 0;
#ifdef SUPPORT_READ_DV2
}
#endif
#ifdef USE_GDK_PIXBUF
}
#endif
if(ret == 0)
{
free(lav_fd);
internal_error = ERROR_FORMAT; /* Format not recognized */
veejay_msg(VEEJAY_MSG_ERROR, "Unable to identify file '%s'", filename);
return 0;
}
}
lav_fd->bps = (lav_audio_channels(lav_fd)*lav_audio_bits(lav_fd)+7)/8;
if(lav_fd->bps==0) lav_fd->bps=1; /* make it save since we will divide by that value */
if(strncasecmp(video_comp, "PICT",4) == 0 )
{
lav_fd->MJPG_chroma = (output_yuv == 1 ? CHROMA420: CHROMA422 );
lav_fd->format = 'x';
lav_fd->interlacing = LAV_NOT_INTERLACED;
veejay_msg(VEEJAY_MSG_DEBUG, "Playing image");
return lav_fd;
}
if(strncasecmp(video_comp, "div3",4)==0) {
lav_fd->MJPG_chroma = CHROMA420;
lav_fd->format = 'D';