diff --git a/veejay-current/libel/avilib.c b/veejay-current/libel/avilib.c index 00dbbb09..38e62e50 100644 --- a/veejay-current/libel/avilib.c +++ b/veejay-current/libel/avilib.c @@ -759,28 +759,9 @@ avi_t *AVI_open_input_file(char *filename, int getIndex, int mmap_size) AVI->video_strn = num_stream; vids_strh_seen = 1; - /* setup FFMPEG codec */ - if( strncasecmp("mjpg", AVI->compressor, 4) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_MJPEG; - if( strncasecmp("jpeg", AVI->compressor, 4) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_MJPEG; - if( strncasecmp("mjpa", AVI->compressor, 4) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_MJPEG; - if( strncasecmp("dvsd", AVI->compressor, 4) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_DVVIDEO; - if( strncasecmp("dv", AVI->compressor, 2) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_DVVIDEO; - if( strncasecmp("mp4v",AVI->compressor,4) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_MPEG4; - if( strncasecmp("div3", AVI->compressor,4) == 0) - AVI->ffmpeg_codec_id = CODEC_ID_MSMPEG4V3; - if( strncasecmp("iyuv", AVI->compressor,4) == 0) - AVI->ffmpeg_codec_id = 999; - if( strncasecmp("i420", AVI->compressor,4) == 0) - AVI->ffmpeg_codec_id = 999; - if( strncasecmp("yv16", AVI->compressor,4) == 0) - AVI->ffmpeg_codec_id = 998; + AVI->ffmpeg_codec_id = + vj_el_get_decoder_from_fourcc( AVI->compressor ); lasttag = 1; /* vids */ } else if (strncasecmp ((char*)hdrl_data+i,"auds",4) ==0 && ! auds_strh_seen) diff --git a/veejay-current/libel/lav_io.c b/veejay-current/libel/lav_io.c index f4b16a48..1b90f365 100644 --- a/veejay-current/libel/lav_io.c +++ b/veejay-current/libel/lav_io.c @@ -418,7 +418,17 @@ lav_file_t *lav_open_output_file(char *filename, char format, (interlaced ? QUICKTIME_MJPA : QUICKTIME_JPEG)); if (asize) quicktime_set_audio(lav_fd->qt_fd, achans, arate, asize, QUICKTIME_TWOS); - return lav_fd; + + int has_kf = quicktime_has_keyframes( lav_fd->qt_fd, 0 ); + char *copyright = quicktime_get_copyright( lav_fd->qt_fd ); + char *name = quicktime_get_name( lav_fd->qt_fd ); + char *info = quicktime_get_info( lav_fd->qt_fd ); + + veejay_msg(VEEJAY_MSG_DEBUG, + "(C) %s by %s, %s, has keyframes = %d", copyright,name,info,has_kf ); + + + return lav_fd; #else internal_error = ERROR_FORMAT; return NULL; @@ -836,29 +846,7 @@ int lav_video_compressor_type(lav_file_t *lav_file) if(lav_file->format == 'q') { const char *compressor = quicktime_video_compressor(lav_file->qt_fd,0); - //@ prrff - if( (strncasecmp("mjpg", compressor, 4) == 0 || strncasecmp("jpeg", compressor, 4) == 0) || - strncasecmp("mjpa", compressor, 4) == 0) { - return CODEC_ID_MJPEG; - } else if( (strncasecmp("dvsd", compressor, 4) == 0) || strncasecmp("dv", compressor,2) == 0 ) { - return CODEC_ID_DVVIDEO; - } else if( strncasecmp("mp4v",compressor,4) == 0) { - return CODEC_ID_MPEG4; - } else if( strncasecmp("div3", compressor,4) == 0) { - return CODEC_ID_MSMPEG4V3; - } else if( strncasecmp("iyuv", compressor,4) == 0 || strncasecmp( "i420",compressor,4)==0) { - return 999; - } else if( strncasecmp("yv16", compressor,4) == 0) { - return 999; - } else if (strncasecmp("svq1",compressor,4) == 0 ) { - return CODEC_ID_SVQ1; - } else if (strncasecmp("rpza", compressor,4) == 0 ) { - return CODEC_ID_RPZA; - } - else - return -1; - - + return vj_el_get_decoder_from_fourcc( compressor ); } // return quicktime_video_compressor(lav_file->qt_fd,0); #endif @@ -1216,12 +1204,17 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) } else if ( lav_fd->avi_fd && AVI_errno == 0 ) { + veejay_msg(VEEJAY_MSG_DEBUG, + "\tFile is AVI" ); ret =1; } + int alt = 0; + if(lav_fd->avi_fd) { ret = 1; + alt = 1; lav_fd->format = 'a'; lav_fd->has_audio = (AVI_audio_bits(lav_fd->avi_fd)>0 && AVI_audio_format(lav_fd->avi_fd)==WAVE_FORMAT_PCM); @@ -1232,10 +1225,10 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) if(lav_fd) free(lav_fd); return 0; } + veejay_msg(VEEJAY_MSG_DEBUG, "\tFOURCC is %s", video_comp ); } else if( AVI_errno==AVI_ERR_NO_AVI || !lav_fd->avi_fd) { - int alt = 0; #ifdef HAVE_LIBQUICKTIME if(quicktime_check_sig(filename)) { @@ -1254,7 +1247,8 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) lav_fd->avi_fd = NULL; lav_fd->format = 'q'; video_comp = quicktime_video_compressor(lav_fd->qt_fd,0); - + veejay_msg(VEEJAY_MSG_DEBUG,"\tFile has fourcc '%s'", + video_comp ); /* We want at least one video track */ if (quicktime_video_tracks(lav_fd->qt_fd) < 1) { @@ -1322,6 +1316,8 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) video_comp = strdup( "PICT" ); ret = 1; alt = 1; + veejay_msg(VEEJAY_MSG_DEBUG, + "\tLoaded image file"); } else veejay_msg(VEEJAY_MSG_DEBUG, @@ -1348,6 +1344,10 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) lav_fd->format = 'b'; lav_fd->has_audio = 0; ret = 1; + alt = 1; + veejay_msg(VEEJAY_MSG_DEBUG, + "RAW DV file '%s'", + video_comp ); } } else @@ -1356,7 +1356,7 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) #endif } - if(ret == 0 || video_comp == NULL) + if(ret == 0 || video_comp == NULL || alt == 0) { free(lav_fd); internal_error = ERROR_FORMAT; /* Format not recognized */ @@ -1367,51 +1367,79 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) 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 */ - + #ifdef USE_GDK_PIXBUF - 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; - return lav_fd; - } + 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; + return lav_fd; + } #endif - if(strncasecmp(video_comp, "div3",4)==0) - { + + if( strncasecmp(video_comp, "div3",4)==0 || + strncasecmp(video_comp, "mp43",4)==0 || + strncasecmp(video_comp, "mp42",4)==0 ) + { lav_fd->MJPG_chroma = CHROMA420; lav_fd->interlacing = LAV_NOT_INTERLACED; veejay_msg(VEEJAY_MSG_WARNING, "Playing MS MPEG4v3 DivX Video. (Every frame should be an intra frame)" ); return lav_fd; } - if(strncasecmp(video_comp,"mp4v",4)==0) + if( strncasecmp(video_comp,"mp4v",4 )==0 || + strncasecmp(video_comp,"divx",4 ) == 0 || + strncasecmp(video_comp,"xvid",4 ) == 0 || + strncasecmp(video_comp,"dxsd",4 ) == 0 || + strncasecmp(video_comp,"mp4s",4 ) == 0 || + strncasecmp(video_comp,"m4s2",4 ) == 0 ) { + lav_fd->format = 'D'; lav_fd->MJPG_chroma = CHROMA420; lav_fd->interlacing = LAV_NOT_INTERLACED; veejay_msg(VEEJAY_MSG_WARNING, "Playing MPEG4 Video (Every frame should be an intra frame)"); return lav_fd; } - - /* Check compressor, no further action if not Motion JPEG/DV */ - if (strncasecmp(video_comp,"iyuv",4)==0) + + if ( strncasecmp(video_comp,"iyuv",4)==0 || + strncasecmp(video_comp,"i420",4)==0) { lav_fd->MJPG_chroma = CHROMA420; lav_fd->format = 'Y'; lav_fd->interlacing = LAV_NOT_INTERLACED; return lav_fd; } - if (strncasecmp(video_comp,"yv16",4)==0) + + if ( strncasecmp(video_comp,"yv16",4)==0 || + strncasecmp(video_comp,"i422",4)==0 || + strncasecmp(video_comp,"hfyu",4)==0) { lav_fd->MJPG_chroma = CHROMA422; lav_fd->format = 'P'; lav_fd->interlacing = LAV_NOT_INTERLACED; return lav_fd; } - if (strncasecmp(video_comp,"dvsd",4)==0 || strncasecmp(video_comp,"dv",2)==0) + + if( strncasecmp(video_comp, "avc1", 4 ) == 0 || + strncasecmp(video_comp, "h264", 4 ) == 0 || + strncasecmp(video_comp, "x264", 4 ) == 0 || + strncasecmp(video_comp, "davc", 4 ) == 0 ) { + lav_fd->MJPG_chroma = CHROMA420; + lav_fd->interlacing = LAV_NOT_INTERLACED; + return lav_fd; + } + + if ( strncasecmp(video_comp,"dvsd",4)==0 || + strncasecmp(video_comp,"dvcp",4) ==0 || + strncasecmp(video_comp,"dxsd",4) == 0 || + strncasecmp(video_comp, "dvp",3) == 0 || + strncasecmp(video_comp, "dvhd",4) == 0 || + strncasecmp(video_comp, "dv",2 ) == 0) + { int gw = lav_video_height( lav_fd ); if( gw == 480 ) lav_fd->MJPG_chroma = CHROMA411; @@ -1422,13 +1450,36 @@ lav_file_t *lav_open_input_file(char *filename, int mmap_size) return lav_fd; } - if (strncasecmp(video_comp, "mjpg", 4) == 0 || strncasecmp(video_comp,"mjpa",4)==0 || - strncasecmp(video_comp, "jpeg", 4) == 0) + if( strncasecmp(video_comp, "png", 3 ) == 0 || + strncasecmp(video_comp, "mpng",4) == 0 ) + { + lav_fd->MJPG_chroma = CHROMA420; + lav_fd->interlacing = LAV_INTER_UNKNOWN; + return lav_fd; + } + + if( strncasecmp(video_comp, "svq1", 4 ) == 0 || + strncasecmp(video_comp, "svq3", 4 ) == 0 || + strncasecmp(video_comp, "rpza", 4 ) == 0 || + strncasecmp(video_comp, "cyuv", 4 ) == 0 ) + { + lav_fd->MJPG_chroma = CHROMA420; + lav_fd->interlacing = LAV_INTER_UNKNOWN; + return lav_fd; + } + + if ( strncasecmp(video_comp,"mjpg", 4) == 0 || + strncasecmp(video_comp,"mjpa", 4) == 0 || + strncasecmp(video_comp,"jpeg", 4) == 0 || + strncasecmp(video_comp,"mjpb" ,4) == 0 || + strncasecmp(video_comp,"sp5x", 4) == 0 || + strncasecmp(video_comp,"jpgl", 4) == 0 || + strncasecmp(video_comp , "jfif", 4 ) == 0 || + strncasecmp(video_comp, "dmb1", 4)==0 ) { lav_fd->MJPG_chroma = CHROMA420; lav_fd->interlacing = LAV_INTER_UNKNOWN; lav_fd->is_MJPG = 1; - // return lav_fd; /* Make some checks on the video source, we read the first frame for that */ diff --git a/veejay-current/libel/rawdv.c b/veejay-current/libel/rawdv.c index c7d04e4f..fa634b2c 100644 --- a/veejay-current/libel/rawdv.c +++ b/veejay-current/libel/rawdv.c @@ -166,7 +166,11 @@ dv_t *rawdv_open_input_file(const char *filename, int mmap_size) dv->buf = (uint8_t*) vj_malloc(sizeof(uint8_t*) * dv->size); dv->offset = 0; - + veejay_msg(VEEJAY_MSG_DEBUG, + "DV properties %d x %d, %f, %d frames, %d sampling", + dv->width,dv->height, dv->fps, dv->num_frames, + dv->fmt ); + dv_decoder_free( decoder ); if(tmp) diff --git a/veejay-current/libel/vj-avcodec.c b/veejay-current/libel/vj-avcodec.c index fe80a066..5daeba28 100644 --- a/veejay-current/libel/vj-avcodec.c +++ b/veejay-current/libel/vj-avcodec.c @@ -151,14 +151,14 @@ static vj_encoder *vj_avcodec_new_encoder( int id, editlist *el, int pixel_forma } e->len = el->video_width * el->video_height; - if(pixel_format == PIX_FMT_YUV422P) + if(el->pixel_format == FMT_422) e->uv_len = e->len / 2; else e->uv_len = e->len / 4; e->width = el->video_width; e->height = el->video_height; - e->out_fmt = pixel_format; + e->out_fmt = el->pixel_format; e->encoder_id = id; /* @@ -279,7 +279,7 @@ int vj_avcodec_init(editlist *el, int pixel_format) if(!el) return 0; out_pixel_format = pixel_format; - av_log_set_level( AV_LOG_INFO ); + //av_log_set_level( AV_LOG_INFO ); return 1; } @@ -434,7 +434,8 @@ static int vj_avcodec_copy_frame( vj_encoder *av, uint8_t *src[3], uint8_t *dst veejay_msg(VEEJAY_MSG_ERROR, "No encoder !!"); return 0; } - if( (av->encoder_id == 999 && av->out_fmt == PIX_FMT_YUV420P) || (av->encoder_id == 998 && av->out_fmt == PIX_FMT_YUV422P)) + + if( (av->encoder_id == 999 && av->out_fmt == FMT_420) || (av->encoder_id == 998 && av->out_fmt == FMT_422)) { /* copy */ veejay_memcpy( dst, src[0], av->len ); @@ -443,13 +444,13 @@ static int vj_avcodec_copy_frame( vj_encoder *av, uint8_t *src[3], uint8_t *dst return ( av->len + av->uv_len + av->uv_len ); } /* copy by converting */ - if( av->encoder_id == 999 && av->out_fmt == PIX_FMT_YUV422P) + if( av->encoder_id == 999 && av->out_fmt == FMT_422) { yuv422p_to_yuv420p( src, dst, av->width, av->height); return ( av->len + (av->len/4) + (av->len/4)); } - if( av->encoder_id == 998 && av->out_fmt == PIX_FMT_YUV420P) + if( av->encoder_id == 998 && av->out_fmt == FMT_420) { uint8_t *d[3]; d[0] = dst; @@ -459,20 +460,6 @@ static int vj_avcodec_copy_frame( vj_encoder *av, uint8_t *src[3], uint8_t *dst return ( av->len + av->len ); } - -/* if(av->sub_sample) - { - return(yuv422p_to_yuv420p(src,dst, av->width, av->height )); - } - else - { - veejay_memcpy( dst, src[0], av->len ); - veejay_memcpy( dst+(av->len), src[1], av->uv_len ); - veejay_memcpy( dst+(av->len+av->uv_len) , src[2], av->uv_len); - } - return (av->len + av->uv_len + av->uv_len); -*/ - return 0; } diff --git a/veejay-current/libel/vj-el.c b/veejay-current/libel/vj-el.c index 1ca5317a..ed5549c5 100644 --- a/veejay-current/libel/vj-el.c +++ b/veejay-current/libel/vj-el.c @@ -49,7 +49,7 @@ #include "rawdv.h" #include "vj-dv.h" #endif -#define MAX_CODECS 32 +#define MAX_CODECS 40 #define CODEC_ID_YUV420 999 #define CODEC_ID_YUV422 998 @@ -76,27 +76,56 @@ static struct { const char *name; int id; - int pix_fmt; } _supported_codecs[] = { { "mjpeg" , CODEC_ID_MJPEG }, { "mjpegb", CODEC_ID_MJPEGB }, -#if LIBAVCODEC_BUILD > 4680 - { "sp5x", CODEC_ID_SP5X }, /* sunplus motion jpeg video */ -#endif -#if LIBAVCODEC_BUILD >= 4685 - { "theora", CODEC_ID_THEORA }, -#endif - { "huffyuv", CODEC_ID_HUFFYUV }, - { "cyuv", CODEC_ID_CYUV }, - { "dv" , CODEC_ID_DVVIDEO }, { "msmpeg4",CODEC_ID_MPEG4 }, { "divx" ,CODEC_ID_MSMPEG4V3 }, { "i420", CODEC_ID_YUV420 }, { "i422", CODEC_ID_YUV422 }, - { "svq1", CODEC_ID_SVQ1 }, - { "rpza", CODEC_ID_RPZA }, - { NULL , 0 }, + { "mjpg", CODEC_ID_MJPEG }, + { "mjpb", CODEC_ID_MJPEGB }, + { "dmb1", CODEC_ID_MJPEG }, + { "jpeg", CODEC_ID_MJPEG }, + { "mjpa", CODEC_ID_MJPEG }, + { "jfif", CODEC_ID_MJPEG }, + { "png", CODEC_ID_PNG }, + { "mpng", CODEC_ID_PNG }, +#if LIBAVCODEC_BUILD > 4680 + { "sp5x", CODEC_ID_SP5X }, /* sunplus motion jpeg video */ +#endif + { "jpgl", CODEC_ID_MJPEG }, + { "dvsd", CODEC_ID_DVVIDEO}, + { "dvcp", CODEC_ID_DVVIDEO}, + { "dv", CODEC_ID_DVVIDEO}, + { "dvhd", CODEC_ID_DVVIDEO}, + { "dvp", CODEC_ID_DVVIDEO}, + { "mp4v", CODEC_ID_MPEG4 }, + { "xvid", CODEC_ID_MPEG4 }, + { "divx", CODEC_ID_MPEG4 }, + { "dxsd", CODEC_ID_MPEG4 }, + { "mp4s", CODEC_ID_MPEG4 }, + { "m4s2", CODEC_ID_MPEG4 }, + { "avc1", CODEC_ID_H264 }, + { "h264", CODEC_ID_H264 }, + { "x264", CODEC_ID_H264 }, + { "davc", CODEC_ID_H264 }, + { "div3", CODEC_ID_MSMPEG4V3 }, + { "mp43", CODEC_ID_MSMPEG4V3 }, + { "mp42", CODEC_ID_MSMPEG4V2 }, + { "mpg4", CODEC_ID_MSMPEG4V1 }, + { "yuv", CODEC_ID_YUV420 }, + { "iyuv", CODEC_ID_YUV420 }, + { "i420", CODEC_ID_YUV420 }, + { "yv16", CODEC_ID_YUV422 }, + { "pict", 0xffff }, + { "hfyu", CODEC_ID_HUFFYUV}, + { "cyuv", CODEC_ID_CYUV }, + { "svq1", CODEC_ID_SVQ1 }, + { "svq3", CODEC_ID_SVQ3 }, + { "rpza", CODEC_ID_RPZA }, + { NULL , 0 }, }; static struct @@ -107,9 +136,15 @@ static struct { { "mjpg", CODEC_ID_MJPEG }, { "mjpb", CODEC_ID_MJPEGB }, + { "dmb1", CODEC_ID_MJPEG }, { "jpeg", CODEC_ID_MJPEG }, { "mjpa", CODEC_ID_MJPEG }, { "jfif", CODEC_ID_MJPEG }, + { "png", CODEC_ID_PNG }, + { "mpng", CODEC_ID_PNG }, +#if LIBAVCODEC_BUILD > 4680 + { "sp5x", CODEC_ID_SP5X }, /* sunplus motion jpeg video */ +#endif { "jpgl", CODEC_ID_MJPEG }, { "dvsd", CODEC_ID_DVVIDEO}, { "dv", CODEC_ID_DVVIDEO}, @@ -121,6 +156,10 @@ static struct { "dxsd", CODEC_ID_MPEG4 }, { "mp4s", CODEC_ID_MPEG4 }, { "m4s2", CODEC_ID_MPEG4 }, + { "avc1", CODEC_ID_H264 }, + { "h264", CODEC_ID_H264 }, + { "x264", CODEC_ID_H264 }, + { "davc", CODEC_ID_H264 }, { "div3", CODEC_ID_MSMPEG4V3 }, { "mp43", CODEC_ID_MSMPEG4V3 }, { "mp42", CODEC_ID_MSMPEG4V2 }, @@ -133,10 +172,8 @@ static struct { "hfyu", CODEC_ID_HUFFYUV}, { "cyuv", CODEC_ID_CYUV }, { "svq1", CODEC_ID_SVQ1 }, + { "svq3", CODEC_ID_SVQ3 }, { "rpza", CODEC_ID_RPZA }, -#if LIBAVCODEC_BUILD > 4680 - { "spsx", CODEC_ID_SP5X }, -#endif { NULL, 0 } }; @@ -183,6 +220,11 @@ static int _el_get_codec_id( const char *fourcc ) return -1; } +int vj_el_get_decoder_from_fourcc( const char *fourcc ) +{ + return _el_get_codec_id( fourcc ); +} + static void _el_free_decoder( vj_decoder *d ) { if(d) @@ -1010,11 +1052,19 @@ int vj_el_get_video_frame(editlist *el, long nframe, uint8_t *dst[3]) data, res ); - if( len <= 0 || !got_picture) + + veejay_msg(0, "bytes remain: %d, decoded %d, pixfmt %d , %d", + res,len, d->context->pix_fmt, in_pix_fmt); + + if(!got_picture) { - veejay_msg(VEEJAY_MSG_ERROR, - "Frame %ld broken or video file is not made of pure I-frames, fix your videofiles", - nframe); + veejay_msg(0, "Unable to get whole picture"); + return 0; + } + + if( len <= 0 ) + { + veejay_msg(VEEJAY_MSG_ERROR, "reading frame"); return 0; } @@ -1024,16 +1074,6 @@ int vj_el_get_video_frame(editlist *el, long nframe, uint8_t *dst[3]) int src_fmt = in_pix_fmt; - /* - int src_fmt = PIX_FMT_YUV444P; -// int src_fmt = ( in_pix_fmt == FMT_420 ? PIX_FMT_YUV420P: PIX_FMT_YUV422P ); - switch(in_pix_fmt) - { - case FMT_420: src_fmt = PIX_FMT_YUV420P; break; - case FMT_411: src_fmt = PIX_FMT_YUV411P; break; - case FMT_422: src_fmt = PIX_FMT_YUV422P; break; - }*/ - int dst_fmt = ( out_pix_fmt== FMT_420 ? PIX_FMT_YUV420P: PIX_FMT_YUV422P) ; pict.data[0] = dst[0];