Quicktime-qtkit : encoding settings now in blender ui (encoding panel)

- added "QuicktimeCodecSettings" struct in DNA
- old "QuicktimeCodecData" opaque struct is  nowdeprecated (read only use when QuicktimeCodecSettings is not set)
- fixed small bug when importing deep color movies

Note that you may need Final Cut Pro installed to be able to use the DVCPRO HD codecs
This commit is contained in:
Damien Plisson 2009-11-20 10:37:50 +00:00
parent 9672993bc1
commit 68eaae8e0e
10 changed files with 180 additions and 88 deletions

@ -337,6 +337,31 @@ class RENDER_PT_output(RenderButtonsPanel):
split.itemR(rd, "tiff_bit") split.itemR(rd, "tiff_bit")
class RENDER_PT_QTencoding(RenderButtonsPanel):
bl_label = "Encoding"
bl_default_closed = True
COMPAT_ENGINES = set(['BLENDER_RENDER'])
def poll(self, context):
rd = context.scene.render_data
return rd.file_format in ('QUICKTIME_QTKIT') # QUICKTIME will be added later
def draw(self, context):
layout = self.layout
rd = context.scene.render_data
wide_ui = context.region.width > narrowui
split = layout.split()
split.itemR(rd, "quicktime_codec_type")
split = layout.split()
if rd.file_format == 'QUICKTIME_QTKIT':
split.itemR(rd, "quicktime_codec_spatial_quality", text="Quality")
class RENDER_PT_encoding(RenderButtonsPanel): class RENDER_PT_encoding(RenderButtonsPanel):
bl_label = "Encoding" bl_label = "Encoding"
bl_default_closed = True bl_default_closed = True
@ -516,6 +541,7 @@ bpy.types.register(RENDER_PT_dimensions)
bpy.types.register(RENDER_PT_antialiasing) bpy.types.register(RENDER_PT_antialiasing)
bpy.types.register(RENDER_PT_shading) bpy.types.register(RENDER_PT_shading)
bpy.types.register(RENDER_PT_output) bpy.types.register(RENDER_PT_output)
bpy.types.register(RENDER_PT_QTencoding)
bpy.types.register(RENDER_PT_encoding) bpy.types.register(RENDER_PT_encoding)
bpy.types.register(RENDER_PT_performance) bpy.types.register(RENDER_PT_performance)
bpy.types.register(RENDER_PT_post_processing) bpy.types.register(RENDER_PT_post_processing)

@ -77,7 +77,7 @@ typedef struct AviCodecData {
} AviCodecData; } AviCodecData;
typedef struct QuicktimeCodecData { typedef struct QuicktimeCodecData {
/*Old quicktime implementation compatibility fields, read only in 2.5 - deprecated*/
void *cdParms; /* codec/compressor options */ void *cdParms; /* codec/compressor options */
void *pad; /* padding */ void *pad; /* padding */
@ -86,6 +86,22 @@ typedef struct QuicktimeCodecData {
char qtcodecname[128]; char qtcodecname[128];
} QuicktimeCodecData; } QuicktimeCodecData;
typedef struct QuicktimeCodecSettings {
/* Codec settings detailed for 2.5 implementation*/
int codecType; /* Types defined in quicktime_export.h */
int codecSpatialQuality; /* in 0-100 scale, to be translated in 0-1024 for qt use */
/* Settings not available in current QTKit API */
int codec;
int codecFlags;
int colorDepth;
int codecTemporalQuality; /* in 0-100 scale, to be translated in 0-1024 for qt use */
int minSpatialQuality; /* in 0-100 scale, to be translated in 0-1024 for qt use */
int minTemporalQuality; /* in 0-100 scale, to be translated in 0-1024 for qt use */
int keyFrameRate;
int bitRate; /* bitrate in bps */
} QuicktimeCodecSettings;
typedef struct FFMpegCodecData { typedef struct FFMpegCodecData {
int type; int type;
@ -176,6 +192,7 @@ typedef struct RenderData {
struct AviCodecData *avicodecdata; struct AviCodecData *avicodecdata;
struct QuicktimeCodecData *qtcodecdata; struct QuicktimeCodecData *qtcodecdata;
struct QuicktimeCodecSettings qtcodecsettings;
struct FFMpegCodecData ffcodecdata; struct FFMpegCodecData ffcodecdata;
int cfra, sfra, efra; /* frames as in 'images' */ int cfra, sfra, efra; /* frames as in 'images' */

@ -30,6 +30,7 @@ if env['WITH_BF_OGG']:
if env['WITH_BF_QUICKTIME']: if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME') defs.append('WITH_QUICKTIME')
incs += ' ../quicktime'
if env['WITH_BF_LCMS']: if env['WITH_BF_LCMS']:
defs.append('WITH_LCMS') defs.append('WITH_LCMS')

@ -63,6 +63,7 @@ IF(WITH_DDS)
ENDIF(WITH_DDS) ENDIF(WITH_DDS)
IF(WITH_QUICKTIME) IF(WITH_QUICKTIME)
SET(INC "${INC} ../../quicktime")
ADD_DEFINITIONS(-DWITH_QUICKTIME) ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME) ENDIF(WITH_QUICKTIME)

@ -52,6 +52,7 @@ if env['WITH_BF_OGG']:
if env['WITH_BF_QUICKTIME']: if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME') defs.append('WITH_QUICKTIME')
incs += ' ../../quicktime'
if env['WITH_BF_LCMS']: if env['WITH_BF_LCMS']:
defs.append('WITH_LCMS') defs.append('WITH_LCMS')

@ -35,6 +35,10 @@
/* Include for Bake Options */ /* Include for Bake Options */
#include "RE_pipeline.h" #include "RE_pipeline.h"
#ifdef WITH_QUICKTIME
#include "quicktime_export.h"
#endif
#ifdef WITH_FFMPEG #ifdef WITH_FFMPEG
#include "BKE_writeffmpeg.h" #include "BKE_writeffmpeg.h"
#include <libavcodec/avcodec.h> #include <libavcodec/avcodec.h>
@ -87,6 +91,7 @@ EnumPropertyItem proportional_editing_items[] = {
#include "ED_info.h" #include "ED_info.h"
#include "ED_node.h" #include "ED_node.h"
#include "ED_view3d.h" #include "ED_view3d.h"
#include "ED_object.h"
#include "RE_pipeline.h" #include "RE_pipeline.h"
@ -349,6 +354,9 @@ static void rna_SceneRenderData_file_format_set(PointerRNA *ptr, int value)
#ifdef WITH_FFMPEG #ifdef WITH_FFMPEG
ffmpeg_verify_image_type(rd); ffmpeg_verify_image_type(rd);
#endif #endif
#ifdef WITH_QUICKTIME
quicktime_verify_image_type(rd);
#endif
} }
void rna_SceneRenderData_jpeg2k_preset_update(RenderData *rd) void rna_SceneRenderData_jpeg2k_preset_update(RenderData *rd)
@ -1439,7 +1447,11 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
{R_AVICODEC, "AVICODEC", ICON_FILE_MOVIE, "AVI Codec", ""}, {R_AVICODEC, "AVICODEC", ICON_FILE_MOVIE, "AVI Codec", ""},
#endif #endif
#ifdef WITH_QUICKTIME #ifdef WITH_QUICKTIME
# ifdef USE_QTKIT
{R_QUICKTIME, "QUICKTIME_QTKIT", ICON_FILE_MOVIE, "QuickTime", ""},
# else
{R_QUICKTIME, "QUICKTIME", ICON_FILE_MOVIE, "QuickTime", ""}, {R_QUICKTIME, "QUICKTIME", ICON_FILE_MOVIE, "QuickTime", ""},
# endif
#endif #endif
#ifdef __sgi #ifdef __sgi
{R_MOVIE, "MOVIE", ICON_FILE_MOVIE, "Movie", ""}, {R_MOVIE, "MOVIE", ICON_FILE_MOVIE, "Movie", ""},
@ -1486,6 +1498,23 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
{16, "16", 0, "16", "16 bit color channels"}, {16, "16", 0, "16", "16 bit color channels"},
{0, NULL, 0, NULL, NULL}}; {0, NULL, 0, NULL, NULL}};
#endif #endif
#ifdef WITH_QUICKTIME
static EnumPropertyItem quicktime_codec_type_items[] = {
{QT_CODECTYPE_RAW, "RAW", 0, "Uncompressed", ""},
{QT_CODECTYPE_JPEG, "JPEG", 0, "JPEG", ""},
{QT_CODECTYPE_MJPEGA, "MJPEG_A", 0, "M-JPEG A", ""},
{QT_CODECTYPE_MJPEGB, "MJPEG_B", 0, "M-JPEG B", ""},
{QT_CODECTYPE_DVCPAL, "DVCPAL", 0, "DV PAL", ""},
{QT_CODECTYPE_DVCNTSC, "DVCNTSC", 0, "DV/DVCPRO NTSC", ""},
{QT_CODECTYPE_DVCPROHD720p, "DVCPROHD720P", 0, "DVCPRO HD 720p"},
{QT_CODECTYPE_DVCPROHD1080i50, "DVCPROHD1080I50", 0, "DVCPRO HD 1080i50"},
{QT_CODECTYPE_DVCPROHD1080i60, "DVCPROHD1080I60", 0, "DVCPRO HD 1080i60"},
{QT_CODECTYPE_MPEG4, "MPEG4", 0, "MPEG4", ""},
{QT_CODECTYPE_H263, "H263", 0, "H.263", ""},
{QT_CODECTYPE_H264, "H264", 0, "H.264", ""},
{0, NULL, 0, NULL, NULL}};
#endif
#ifdef WITH_FFMPEG #ifdef WITH_FFMPEG
static EnumPropertyItem ffmpeg_format_items[] = { static EnumPropertyItem ffmpeg_format_items[] = {
@ -1676,6 +1705,22 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
#endif #endif
#ifdef WITH_QUICKTIME
/* QuickTime */
prop= RNA_def_property(srna, "quicktime_codec_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "qtcodecsettings.codecType");
RNA_def_property_enum_items(prop, quicktime_codec_type_items);
RNA_def_property_ui_text(prop, "Codec", "QuickTime codec type");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "quicktime_codec_spatial_quality", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "qtcodecsettings.codecSpatialQuality");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Spatial quality", "Intra-frame spatial quality level");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
#endif
#ifdef WITH_FFMPEG #ifdef WITH_FFMPEG
/* FFMPEG Video*/ /* FFMPEG Video*/

@ -74,6 +74,37 @@ typedef struct QuicktimeExport {
static struct QuicktimeExport *qtexport; static struct QuicktimeExport *qtexport;
static NSString *stringWithCodecType(int codecType) {
switch (codecType) {
case QT_CODECTYPE_RAW:
return @"raw ";
case QT_CODECTYPE_MJPEGA:
return @"mjpa";
case QT_CODECTYPE_MJPEGB:
return @"mjpb";
case QT_CODECTYPE_DVCPAL:
return @"dvcp";
case QT_CODECTYPE_DVCNTSC:
return @"dvc ";
case QT_CODECTYPE_MPEG4:
return @"mp4v";
case QT_CODECTYPE_H263:
return @"h263";
case QT_CODECTYPE_H264:
return @"avc1";
case QT_CODECTYPE_DVCPROHD720p:
return @"dvhp";
case QT_CODECTYPE_DVCPROHD1080i50:
return @"dvh5";
case QT_CODECTYPE_DVCPROHD1080i60:
return @"dvh6";
case QT_CODECTYPE_JPEG:
default:
return @"jpeg";
}
}
void makeqtstring (RenderData *rd, char *string) { void makeqtstring (RenderData *rd, char *string) {
char txt[64]; char txt[64];
@ -121,13 +152,22 @@ void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty)
qtexport->frameDuration = QTMakeTime(rd->frs_sec_base*1000, rd->frs_sec*1000); qtexport->frameDuration = QTMakeTime(rd->frs_sec_base*1000, rd->frs_sec*1000);
/* specifying the codec attributes /* specifying the codec attributes : try to retrieve them from render data first*/
TODO: get these values from RenderData/scene*/ if (rd->qtcodecsettings.codecType) {
qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg", qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
QTAddImageCodecType, stringWithCodecType(rd->qtcodecsettings.codecType),
[NSNumber numberWithLong:codecHighQuality], QTAddImageCodecType,
QTAddImageCodecQuality, [NSNumber numberWithLong:((rd->qtcodecsettings.codecSpatialQuality)*codecLosslessQuality)/100],
nil]; QTAddImageCodecQuality,
nil];
}
else {
qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg",
QTAddImageCodecType,
[NSNumber numberWithLong:codecHighQuality],
QTAddImageCodecQuality,
nil];
}
[qtexport->frameAttributes retain]; [qtexport->frameAttributes retain];
} }
} }
@ -206,83 +246,17 @@ void end_qt(void)
void free_qtcomponentdata(void) { void free_qtcomponentdata(void) {
} }
void quicktime_verify_image_type(RenderData *rd)
int get_qtcodec_settings(RenderData *rd)
{ {
/* if (rd->imtype == R_QUICKTIME) {
// get previous selected codecsetting, if any if ((rd->qtcodecsettings.codecType<= 0) ||
if(rd->qtcodecdata && rd->qtcodecdata->cdParms) { (rd->qtcodecsettings.codecSpatialQuality <0) ||
QT_GetCodecSettingsFromScene(rd); (rd->qtcodecsettings.codecSpatialQuality > 100)) {
check_renderbutton_framerate(rd);
} else {
// configure the standard image compression dialog box
// set some default settings
qtdata->gSpatialSettings.codec = anyCodec;
qtdata->gSpatialSettings.spatialQuality = codecMaxQuality;
qtdata->gTemporalSettings.temporalQuality = codecMaxQuality;
qtdata->gTemporalSettings.keyFrameRate = 25;
qtdata->aDataRateSetting.dataRate = 90 * 1024;
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
CheckError(err, "SCSetInfo1 error");
err = SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
CheckError(err, "SCSetInfo2 error");
err = SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
CheckError(err, "SCSetInfo3 error");
}
check_renderbutton_framerate(rd);
// put up the dialog box - it needs to be called from the main thread
err = SCRequestSequenceSettings(qtdata->theComponent);
if (err == scUserCancelled) {
G.afbreek = 1;
return 0;
}
// get user selected data
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
QT_SaveCodecSettingsToScene(rd);
// framerate jugglin'
switch (qtexport->frameRate) {
case 1571553: // 23.98 fps
qtexport->frameDuration = QTMakeTime(1001, 24000);
rd->frs_sec = 24;
rd->frs_sec_base = 1.001;
break;
case 1964113: // 29.97 fps
qtexport->frameDuration = QTMakeTime(1001, 30000);
rd->frs_sec = 30;
rd->frs_sec_base = 1.001;
break;
case 3928227: // 59.94 fps
qtexport->frameDuration = QTMakeTime(1001, 60000);
rd->frs_sec = 60;
rd->frs_sec_base = 1.001;
break;
default:
{
double fps = qtexport->frameRate;
qtexport->frameDuration = QTMakeTime(60000/(qtexport->frameRate / 65536), 60000);
if ((qtexport->frameRate & 0xffff) == 0) { rd->qtcodecsettings.codecType = QT_CODECTYPE_JPEG;
rd->frs_sec = fps / 65536; rd->qtcodecsettings.codecSpatialQuality = (codecHighQuality*100)/codecLosslessQuality;
rd->frs_sec_base = 1;
} else {
// we do our very best...
rd->frs_sec = (fps * 10000 / 65536);
rd->frs_sec_base = 10000;
}
} }
break;
} }
*/
return 1;
} }
#endif /* _WIN32 || __APPLE__ */ #endif /* _WIN32 || __APPLE__ */

@ -157,8 +157,9 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height)
} }
} }
if (([bitmapImage bitmapFormat] & 0x5) == 0) { if (([bitmapImage bitsPerPixel] == 32) && (([bitmapImage bitmapFormat] & 0x5) == 0)
/* Try a fast copy if the image is a planar RGBA 32bit bitmap*/ && ![bitmapImage isPlanar]) {
/* Try a fast copy if the image is a meshed RGBA 32bit bitmap*/
toIBuf = (uchar*)ibuf->rect; toIBuf = (uchar*)ibuf->rect;
rasterRGB = (uchar*)[bitmapImage bitmapData]; rasterRGB = (uchar*)[bitmapImage bitmapData];
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {

@ -165,8 +165,6 @@ static OSErr QT_SaveCodecSettingsToScene(RenderData *rd)
qcd->cdSize = mySize; qcd->cdSize = mySize;
GetCodecInfo (&ci, qtdata->gSpatialSettings.codecType, 0); GetCodecInfo (&ci, qtdata->gSpatialSettings.codecType, 0);
CopyPascalStringToC(ci.typeName, str);
sprintf(qcd->qtcodecname, "Codec: %s", str);
} else { } else {
printf("Quicktime: QT_SaveCodecSettingsToScene failed\n"); printf("Quicktime: QT_SaveCodecSettingsToScene failed\n");
} }
@ -599,6 +597,18 @@ static void check_renderbutton_framerate(RenderData *rd)
} }
} }
void quicktime_verify_image_type(RenderData *rd)
{
if (rd->imtype == R_QUICKTIME) {
if ((rd->qtcodecsettings.codecType<= 0) ||
(rd->qtcodecsettings.codecSpatialQuality <0) ||
(rd->qtcodecsettings.codecSpatialQuality > 100)) {
rd->qtcodecsettings.codecType = QT_CODECTYPE_JPEG;
rd->qtcodecsettings.codecSpatialQuality = (codecHighQuality*100)/codecLosslessQuality;
}
}
}
int get_qtcodec_settings(RenderData *rd) int get_qtcodec_settings(RenderData *rd)
{ {
@ -623,8 +633,8 @@ int get_qtcodec_settings(RenderData *rd)
// set some default settings: codec=jpeg, quality = max // set some default settings: codec=jpeg, quality = max
qtdata->gSpatialSettings.codecType = kJPEGCodecType; qtdata->gSpatialSettings.codecType = kJPEGCodecType;
qtdata->gSpatialSettings.codec = anyCodec; qtdata->gSpatialSettings.codec = anyCodec;
qtdata->gSpatialSettings.spatialQuality = codecMaxQuality; qtdata->gSpatialSettings.spatialQuality = codecHighQuality;
qtdata->gTemporalSettings.temporalQuality = codecMaxQuality; qtdata->gTemporalSettings.temporalQuality = codecHighQuality;
qtdata->gTemporalSettings.keyFrameRate = 25; qtdata->gTemporalSettings.keyFrameRate = 25;
qtdata->aDataRateSetting.dataRate = 5 * 1024 * 1024; qtdata->aDataRateSetting.dataRate = 5 * 1024 * 1024;

@ -33,14 +33,30 @@
#define __AIFF__ #define __AIFF__
/* Quicktime codec types defines */
#define QT_CODECTYPE_JPEG 1
#define QT_CODECTYPE_MJPEGA 2
#define QT_CODECTYPE_MJPEGB 3
#define QT_CODECTYPE_DVCPAL 4
#define QT_CODECTYPE_DVCNTSC 5
#define QT_CODECTYPE_MPEG4 6
#define QT_CODECTYPE_H263 7
#define QT_CODECTYPE_H264 8
#define QT_CODECTYPE_RAW 9
#define QT_CODECTYPE_DVCPROHD720p 10
#define QT_CODECTYPE_DVCPROHD1080i50 11
#define QT_CODECTYPE_DVCPROHD1080i60 12
// quicktime movie output functions // quicktime movie output functions
struct RenderData; struct RenderData;
struct Scene;
void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty); //for movie handle (BKE writeavi.c now) void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty); //for movie handle (BKE writeavi.c now)
void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty); void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
void end_qt(void); void end_qt(void);
int get_qtcodec_settings(struct RenderData *rd); //for buttons.c void quicktime_verify_image_type(struct RenderData *rd); //used by RNA for defaults values init, if needed
void free_qtcomponentdata(void); void free_qtcomponentdata(void);
void makeqtstring(struct RenderData *rd, char *string); //for playanim.c void makeqtstring(struct RenderData *rd, char *string); //for playanim.c