Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/makesrna/intern/rna_scene.c60
-rw-r--r--source/blender/quicktime/apple/qtkit_export.m95
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m5
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c167
-rw-r--r--source/blender/quicktime/quicktime_export.h109
5 files changed, 341 insertions, 95 deletions
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 433e0974d35..8e7813e6946 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -410,6 +410,48 @@ static void rna_SceneRenderData_jpeg2k_depth_set(PointerRNA *ptr, int value)
}
#endif
+#ifdef WITH_QUICKTIME
+static int rna_SceneRenderData_qtcodecsettings_codecType_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+
+ return quicktime_rnatmpvalue_from_codectype(rd->qtcodecsettings.codecType);
+}
+
+static void rna_SceneRenderData_qtcodecsettings_codecType_set(PointerRNA *ptr, int value)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+
+ rd->qtcodecsettings.codecType = quicktime_codecType_from_rnatmpvalue(value);
+}
+
+static EnumPropertyItem *rna_SceneRenderData_qtcodecsettings_codecType_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ EnumPropertyItem *item= NULL;
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
+ QuicktimeCodecTypeDesc *codecTypeDesc;
+ int i=1, totitem= 0;
+ char id[5];
+
+ for(i=0;i<quicktime_get_num_codecs();i++) {
+ codecTypeDesc = quicktime_get_codecType_desc(i);
+ if (!codecTypeDesc) break;
+
+ tmp.value= codecTypeDesc->rnatmpvalue;
+ *((int*)id) = codecTypeDesc->codecType;
+ id[4] = 0;
+ tmp.identifier= id;
+ tmp.name= codecTypeDesc->codecName;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+#endif
+
static int rna_SceneRenderData_active_layer_index_get(PointerRNA *ptr)
{
RenderData *rd= (RenderData*)ptr->data;
@@ -1457,7 +1499,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
# ifdef USE_QTKIT
{R_QUICKTIME, "QUICKTIME_QTKIT", ICON_FILE_MOVIE, "QuickTime", ""},
# else
- {R_QUICKTIME, "QUICKTIME", ICON_FILE_MOVIE, "QuickTime", ""},
+ {R_QUICKTIME, "QUICKTIME_CARBON", ICON_FILE_MOVIE, "QuickTime", ""},
# endif
#endif
#ifdef __sgi
@@ -1508,18 +1550,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
#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, "codec", 0, "codec", ""},
{0, NULL, 0, NULL, NULL}};
#endif
@@ -1718,6 +1749,9 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
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_enum_funcs(prop, "rna_SceneRenderData_qtcodecsettings_codecType_get",
+ "rna_SceneRenderData_qtcodecsettings_codecType_set",
+ "rna_SceneRenderData_qtcodecsettings_codecType_itemf");
RNA_def_property_ui_text(prop, "Codec", "QuickTime codec type");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m
index 6788c22d9a1..59cd669d738 100644
--- a/source/blender/quicktime/apple/qtkit_export.m
+++ b/source/blender/quicktime/apple/qtkit_export.m
@@ -49,10 +49,6 @@
#include "MEM_guardedalloc.h"
-#include "quicktime_import.h"
-#include "quicktime_export.h"
-
-
#ifdef __APPLE__
/* evil */
#ifndef __AIFF__
@@ -65,6 +61,9 @@
#error OSX 10.5 minimum is needed for QTKit
#endif
+#include "quicktime_import.h"
+#include "quicktime_export.h"
+
#endif /* __APPLE__ */
typedef struct QuicktimeExport {
@@ -78,36 +77,65 @@ typedef struct QuicktimeExport {
static struct QuicktimeExport *qtexport;
+#pragma mark rna helper functions
-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";
+
+static QuicktimeCodecTypeDesc qtCodecList[] = {
+ {kRawCodecType, 1, "Uncompressed"},
+ {kJPEGCodecType, 2, "JPEG"},
+ {kMotionJPEGACodecType, 3, "M-JPEG A"},
+ {kMotionJPEGBCodecType, 4, "M-JPEG B"},
+ {kDVCPALCodecType, 5, "DV PAL"},
+ {kDVCNTSCCodecType, 6, "DV/DVCPRO NTSC"},
+ {kDVCPROHD720pCodecType, 7, "DVCPRO HD 720p"},
+ {kDVCPROHD1080i50CodecType, 8, "DVCPRO HD 1080i50"},
+ {kDVCPROHD1080i60CodecType, 9, "DVCPRO HD 1080i60"},
+ {kMPEG4VisualCodecType, 10, "MPEG4"},
+ {kH263CodecType, 11, "H.263"},
+ {kH264CodecType, 12, "H.264"},
+ {0,0,NULL}};
+
+static int qtCodecCount = 12;
+
+int quicktime_get_num_codecs() {
+ return qtCodecCount;
+}
+
+QuicktimeCodecTypeDesc* quicktime_get_codecType_desc(int indexValue) {
+ if ((indexValue>=0) && (indexValue < qtCodecCount))
+ return &qtCodecList[indexValue];
+ else
+ return NULL;
+}
+
+int quicktime_rnatmpvalue_from_codectype(int codecType) {
+ int i;
+ for (i=0;i<qtCodecCount;i++) {
+ if (qtCodecList[i].codecType == codecType)
+ return qtCodecList[i].rnatmpvalue;
}
+
+ return 0;
+}
+
+int quicktime_codecType_from_rnatmpvalue(int rnatmpvalue) {
+ int i;
+ for (i=0;i<qtCodecCount;i++) {
+ if (qtCodecList[i].rnatmpvalue == rnatmpvalue)
+ return qtCodecList[i].codecType;
+ }
+
+ return 0;
+}
+
+
+static NSString *stringWithCodecType(int codecType) {
+ char str[5];
+
+ *((int*)str) = EndianU32_NtoB(codecType);
+ str[4] = 0;
+
+ return [NSString stringWithCString:str encoding:NSASCIIStringEncoding];
}
void makeqtstring (RenderData *rd, char *string) {
@@ -124,6 +152,7 @@ void makeqtstring (RenderData *rd, char *string) {
}
}
+#pragma mark export functions
void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty)
{
@@ -264,7 +293,7 @@ void quicktime_verify_image_type(RenderData *rd)
(rd->qtcodecsettings.codecSpatialQuality <0) ||
(rd->qtcodecsettings.codecSpatialQuality > 100)) {
- rd->qtcodecsettings.codecType = QT_CODECTYPE_JPEG;
+ rd->qtcodecsettings.codecType = kJPEGCodecType;
rd->qtcodecsettings.codecSpatialQuality = (codecHighQuality*100)/codecLosslessQuality;
}
}
diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m
index 500ee13330d..31a6ca71259 100644
--- a/source/blender/quicktime/apple/qtkit_import.m
+++ b/source/blender/quicktime/apple/qtkit_import.m
@@ -137,7 +137,7 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height)
uchar *toIBuf = NULL;
int x, y, to_i, from_i;
NSSize bitmapSize;
- NSBitmapImageRep *blBitmapFormatImageRGB,*blBitmapFormatImageRGBA,*bitmapImage;
+ NSBitmapImageRep *blBitmapFormatImageRGB,*blBitmapFormatImageRGBA,*bitmapImage=nil;
NSEnumerator *enumerator;
NSImageRep *representation;
@@ -150,12 +150,13 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height)
/*Get the bitmap of the image*/
enumerator = [[sourceImage representations] objectEnumerator];
- while (representation = [enumerator nextObject]) {
+ while ((representation = [enumerator nextObject])) {
if ([representation isKindOfClass:[NSBitmapImageRep class]]) {
bitmapImage = (NSBitmapImageRep *)representation;
break;
}
}
+ if (bitmapImage == nil) return NULL;
if (([bitmapImage bitsPerPixel] == 32) && (([bitmapImage bitmapFormat] & 0x5) == 0)
&& ![bitmapImage isPlanar]) {
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index 851b3c5b245..c6c412ae24b 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -77,6 +77,7 @@ static void QT_EndAddVideoSamplesToMedia (void);
static void QT_CreateMyVideoTrack (int rectx, int recty);
static void QT_EndCreateMyVideoTrack (void);
static void check_renderbutton_framerate(struct RenderData *rd);
+static int get_qtcodec_settings(struct RenderData *rd);
typedef struct QuicktimeExport {
@@ -113,6 +114,57 @@ static struct QuicktimeComponentData *qtdata;
static int sframe;
+/* RNA functions */
+
+static QuicktimeCodecTypeDesc qtCodecList[] = {
+ {kRawCodecType, 1, "Uncompressed"},
+ {kJPEGCodecType, 2, "JPEG"},
+ {kMotionJPEGACodecType, 3, "M-JPEG A"},
+ {kMotionJPEGBCodecType, 4, "M-JPEG B"},
+ {kDVCPALCodecType, 5, "DV PAL"},
+ {kDVCNTSCCodecType, 6, "DV/DVCPRO NTSC"},
+ {kDVCPROHD720pCodecType, 7, "DVCPRO HD 720p"},
+ {kDVCPROHD1080i50CodecType, 8, "DVCPRO HD 1080i50"},
+ {kDVCPROHD1080i60CodecType, 9, "DVCPRO HD 1080i60"},
+ {kMPEG4VisualCodecType, 10, "MPEG4"},
+ {kH263CodecType, 11, "H.263"},
+ {kH264CodecType, 12, "H.264"},
+ {0,0,NULL}};
+
+static int qtCodecCount = 12;
+
+int quicktime_get_num_codecs() {
+ return qtCodecCount;
+}
+
+QuicktimeCodecTypeDesc* quicktime_get_codecType_desc(int indexValue) {
+ if ((indexValue>=0) && (indexValue < qtCodecCount))
+ return &qtCodecList[indexValue];
+ else
+ return NULL;
+}
+
+int quicktime_rnatmpvalue_from_codectype(int codecType) {
+ int i;
+ for (i=0;i<qtCodecCount;i++) {
+ if (qtCodecList[i].codecType == codecType)
+ return qtCodecList[i].rnatmpvalue;
+ }
+
+ return 0;
+}
+
+int quicktime_codecType_from_rnatmpvalue(int rnatmpvalue) {
+ int i;
+ for (i=0;i<qtCodecCount;i++) {
+ if (qtCodecList[i].rnatmpvalue == rnatmpvalue)
+ return qtCodecList[i].codecType;
+ }
+
+ return 0;
+}
+
+
static void CheckError(OSErr err, char *msg)
{
@@ -128,10 +180,9 @@ static OSErr QT_SaveCodecSettingsToScene(RenderData *rd)
long mySize = 0;
CodecInfo ci;
- char str[255];
QuicktimeCodecData *qcd = rd->qtcodecdata;
-
+
// check if current scene already has qtcodec settings, and clear them
if (qcd) {
free_qtcodecdata(qcd);
@@ -183,8 +234,6 @@ static OSErr QT_GetCodecSettingsFromScene(RenderData *rd)
{
Handle myHandle = NULL;
ComponentResult myErr = noErr;
-// CodecInfo ci;
-// char str[255];
QuicktimeCodecData *qcd = rd->qtcodecdata;
@@ -207,9 +256,22 @@ static OSErr QT_GetCodecSettingsFromScene(RenderData *rd)
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
-// GetCodecInfo (&ci, qtdata->gSpatialSettings.codecType, 0);
-// CopyPascalStringToC(ci.typeName, str);
-// printf("restored Codec: %s\n", str);
+
+ //Fill the render QuicktimeCodecSettigns struct
+ rd->qtcodecsettings.codecTemporalQuality = (qtdata->gTemporalSettings.temporalQuality * 100) / codecLosslessQuality;
+ //Do not override scene frame rate (qtdata->gTemporalSettings.framerate)
+ rd->qtcodecsettings.keyFrameRate = qtdata->gTemporalSettings.keyFrameRate;
+
+ rd->qtcodecsettings.codecType = qtdata->gSpatialSettings.codecType;
+ rd->qtcodecsettings.codec = (int)qtdata->gSpatialSettings.codec;
+ rd->qtcodecsettings.colorDepth = qtdata->gSpatialSettings.depth;
+ rd->qtcodecsettings.codecSpatialQuality = (qtdata->gSpatialSettings.spatialQuality * 100) / codecLosslessQuality;
+
+ rd->qtcodecsettings.bitRate = qtdata->aDataRateSetting.dataRate;
+ rd->qtcodecsettings.minSpatialQuality = (qtdata->aDataRateSetting.minSpatialQuality * 100) / codecLosslessQuality;
+ rd->qtcodecsettings.minTemporalQuality = (qtdata->aDataRateSetting.minTemporalQuality * 100) / codecLosslessQuality;
+ //Frame duration is already known (qtdata->aDataRateSetting.frameDuration)
+
} else {
printf("Quicktime: QT_GetCodecSettingsFromScene failed\n");
}
@@ -473,6 +535,7 @@ void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty)
makeqtstring(rd, name);
#ifdef __APPLE__
+ EnterMoviesOnThread(0);
sprintf(theFullPath, "%s", name);
/* hack: create an empty file to make FSPathMakeRef() happy */
@@ -508,6 +571,9 @@ void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty)
if(err != noErr) {
G.afbreek = 1;
// XXX error("Unable to create Quicktime movie: %s", name);
+#ifdef __APPLE__
+ ExitMoviesOnThread();
+#endif
} else {
printf("Created QuickTime movie: %s\n", name);
@@ -545,6 +611,8 @@ void end_qt(void) {
printf("Finished QuickTime movie.\n");
}
+ ExitMoviesOnThread();
+
if(qtexport) {
MEM_freeN(qtexport);
qtexport = NULL;
@@ -576,7 +644,7 @@ static void check_renderbutton_framerate(RenderData *rd)
else {
if (rd->frs_sec_base > 0)
qtdata->gTemporalSettings.frameRate =
- (rd->frs_sec << 16) / rd->frs_sec_base ;
+ ((float)(rd->frs_sec << 16) / rd->frs_sec_base) ;
}
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
@@ -600,21 +668,24 @@ static void check_renderbutton_framerate(RenderData *rd)
void quicktime_verify_image_type(RenderData *rd)
{
if (rd->imtype == R_QUICKTIME) {
- if ((rd->qtcodecsettings.codecType<= 0) ||
+ if ((rd->qtcodecsettings.codecType== 0) ||
(rd->qtcodecsettings.codecSpatialQuality <0) ||
(rd->qtcodecsettings.codecSpatialQuality > 100)) {
- rd->qtcodecsettings.codecType = QT_CODECTYPE_JPEG;
+ rd->qtcodecsettings.codecType = kJPEGCodecType;
+ rd->qtcodecsettings.codec = (int)anyCodec;
rd->qtcodecsettings.codecSpatialQuality = (codecHighQuality*100)/codecLosslessQuality;
+ rd->qtcodecsettings.codecTemporalQuality = (codecHighQuality*100)/codecLosslessQuality;
+ rd->qtcodecsettings.keyFrameRate = 25;
+ rd->qtcodecsettings.bitRate = 5000000; //5 Mbps
}
}
}
int get_qtcodec_settings(RenderData *rd)
{
- OSErr err = noErr;
-
- // erase any existing codecsetting
+ OSErr err = noErr;
+ // erase any existing codecsetting
if(qtdata) {
if(qtdata->theComponent) CloseComponent(qtdata->theComponent);
free_qtcomponentdata();
@@ -624,20 +695,28 @@ int get_qtcodec_settings(RenderData *rd)
qtdata = MEM_callocN(sizeof(QuicktimeComponentData), "QuicktimeComponentData");
qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType);
- // get previous selected codecsetting, if any
+ // get previous selected codecsetting, from qtatom or detailed settings
if(rd->qtcodecdata && rd->qtcodecdata->cdParms) {
QT_GetCodecSettingsFromScene(rd);
- check_renderbutton_framerate(rd);
} else {
- // configure the standard image compression dialog box
- // set some default settings: codec=jpeg, quality = max
- qtdata->gSpatialSettings.codecType = kJPEGCodecType;
- qtdata->gSpatialSettings.codec = anyCodec;
- qtdata->gSpatialSettings.spatialQuality = codecHighQuality;
- qtdata->gTemporalSettings.temporalQuality = codecHighQuality;
- qtdata->gTemporalSettings.keyFrameRate = 25;
- qtdata->aDataRateSetting.dataRate = 5 * 1024 * 1024;
+ SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
+ SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
+ SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
+ qtdata->gSpatialSettings.codecType = rd->qtcodecsettings.codecType;
+ qtdata->gSpatialSettings.codec = (CodecComponent)rd->qtcodecsettings.codec;
+ qtdata->gSpatialSettings.spatialQuality = (rd->qtcodecsettings.codecSpatialQuality * codecLosslessQuality) /100;
+ qtdata->gTemporalSettings.temporalQuality = (rd->qtcodecsettings.codecTemporalQuality * codecLosslessQuality) /100;
+ qtdata->gTemporalSettings.keyFrameRate = rd->qtcodecsettings.keyFrameRate;
+ qtdata->aDataRateSetting.dataRate = rd->qtcodecsettings.bitRate;
+ qtdata->gSpatialSettings.depth = rd->qtcodecsettings.colorDepth;
+ qtdata->aDataRateSetting.minSpatialQuality = (rd->qtcodecsettings.minSpatialQuality * codecLosslessQuality) / 100;
+ qtdata->aDataRateSetting.minTemporalQuality = (rd->qtcodecsettings.minTemporalQuality * codecLosslessQuality) / 100;
+
+ qtdata->aDataRateSetting.frameDuration = rd->frs_sec;
+ SetMovieTimeScale(qtexport->theMovie, rd->frs_sec_base*1000);
+
+
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
CheckError(err, "SCSetInfo1 error");
err = SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
@@ -647,22 +726,42 @@ int get_qtcodec_settings(RenderData *rd)
}
check_renderbutton_framerate(rd);
+
+ return err;
+}
- /* Remove this dialog box pop up as this function is called from the render thread
- Anyway, all config should be done inside blender ui before starting render.
- // put up the dialog box - it needs to be called from the main thread
+int request_qtcodec_settings(RenderData *rd)
+{
+ OSErr err = noErr;
+
+ // 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);
+ // update runtime codecsettings for use with the codec dialog
+ SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
- SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);*/
-
+ SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
+
+
+ //Fill the render QuicktimeCodecSettings struct
+ rd->qtcodecsettings.codecTemporalQuality = (qtdata->gTemporalSettings.temporalQuality * 100) / codecLosslessQuality;
+ //Do not override scene frame rate (qtdata->gTemporalSettings.framerate)
+ rd->qtcodecsettings.keyFrameRate = qtdata->gTemporalSettings.keyFrameRate;
+
+ rd->qtcodecsettings.codecType = qtdata->gSpatialSettings.codecType;
+ rd->qtcodecsettings.codec = (int)qtdata->gSpatialSettings.codec;
+ rd->qtcodecsettings.colorDepth = qtdata->gSpatialSettings.depth;
+ rd->qtcodecsettings.codecSpatialQuality = (qtdata->gSpatialSettings.spatialQuality * 100) / codecLosslessQuality;
+
+ rd->qtcodecsettings.bitRate = qtdata->aDataRateSetting.dataRate;
+ rd->qtcodecsettings.minSpatialQuality = (qtdata->aDataRateSetting.minSpatialQuality * 100) / codecLosslessQuality;
+ rd->qtcodecsettings.minTemporalQuality = (qtdata->aDataRateSetting.minTemporalQuality * 100) / codecLosslessQuality;
+ //Frame duration is already known (qtdata->aDataRateSetting.frameDuration)
+
QT_SaveCodecSettingsToScene(rd);
// framerate jugglin'
@@ -692,11 +791,11 @@ int get_qtcodec_settings(RenderData *rd)
if ((qtdata->gTemporalSettings.frameRate & 0xffff) == 0) {
rd->frs_sec = fps / 65536;
- rd->frs_sec_base = 1;
+ rd->frs_sec_base = 1.0;
} else {
/* we do our very best... */
- rd->frs_sec = (fps * 10000 / 65536);
- rd->frs_sec_base = 10000;
+ rd->frs_sec = fps / 65536;
+ rd->frs_sec_base = 1.0;
}
}
diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h
index 7972c826190..61153ff91d2 100644
--- a/source/blender/quicktime/quicktime_export.h
+++ b/source/blender/quicktime/quicktime_export.h
@@ -33,19 +33,13 @@
#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
+
+/*Codec list*/
+typedef struct QuicktimeCodecTypeDesc {
+ int codecType;
+ int rnatmpvalue;
+ char * codecName;
+} QuicktimeCodecTypeDesc ;
// quicktime movie output functions
struct RenderData;
@@ -55,11 +49,100 @@ void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
void end_qt(void);
+/*RNA helper functions */
void quicktime_verify_image_type(struct RenderData *rd); //used by RNA for defaults values init, if needed
+int quicktime_get_num_codecs();
+QuicktimeCodecTypeDesc* quicktime_get_codecType_desc(int indexValue);
+int quicktime_rnatmpvalue_from_codectype(int codecType);
+int quicktime_codecType_from_rnatmpvalue(int rnatmpvalue);
+
+#ifndef USE_QTKIT
+int request_qtcodec_settings(struct RenderData *rd); //Raise quicktime standard dialog to request codec settings
+#endif
+
void free_qtcomponentdata(void);
void makeqtstring(struct RenderData *rd, char *string); //for playanim.c
+
+
+#if (defined(USE_QTKIT) && defined(MAC_OS_X_VERSION_10_6) && __LP64__)
+//Include the quicktime codec types constants that are missing in QTKitDefines.h in 10.6 / 64bit
+enum {
+ kRawCodecType = 'raw ',
+ kCinepakCodecType = 'cvid',
+ kGraphicsCodecType = 'smc ',
+ kAnimationCodecType = 'rle ',
+ kVideoCodecType = 'rpza',
+ kComponentVideoCodecType = 'yuv2',
+ kJPEGCodecType = 'jpeg',
+ kMotionJPEGACodecType = 'mjpa',
+ kMotionJPEGBCodecType = 'mjpb',
+ kSGICodecType = '.SGI',
+ kPlanarRGBCodecType = '8BPS',
+ kMacPaintCodecType = 'PNTG',
+ kGIFCodecType = 'gif ',
+ kPhotoCDCodecType = 'kpcd',
+ kQuickDrawGXCodecType = 'qdgx',
+ kAVRJPEGCodecType = 'avr ',
+ kOpenDMLJPEGCodecType = 'dmb1',
+ kBMPCodecType = 'WRLE',
+ kWindowsRawCodecType = 'WRAW',
+ kVectorCodecType = 'path',
+ kQuickDrawCodecType = 'qdrw',
+ kWaterRippleCodecType = 'ripl',
+ kFireCodecType = 'fire',
+ kCloudCodecType = 'clou',
+ kH261CodecType = 'h261',
+ kH263CodecType = 'h263',
+ kDVCNTSCCodecType = 'dvc ', /* DV - NTSC and DVCPRO NTSC (available in QuickTime 6.0 or later)*/
+ /* NOTE: kDVCProNTSCCodecType is deprecated. */
+ /* Use kDVCNTSCCodecType instead -- as far as the codecs are concerned, */
+ /* the two data formats are identical.*/
+ kDVCPALCodecType = 'dvcp',
+ kDVCProPALCodecType = 'dvpp', /* available in QuickTime 6.0 or later*/
+ kDVCPro50NTSCCodecType = 'dv5n',
+ kDVCPro50PALCodecType = 'dv5p',
+ kDVCPro100NTSCCodecType = 'dv1n',
+ kDVCPro100PALCodecType = 'dv1p',
+ kDVCPROHD720pCodecType = 'dvhp',
+ kDVCPROHD1080i60CodecType = 'dvh6',
+ kDVCPROHD1080i50CodecType = 'dvh5',
+ kBaseCodecType = 'base',
+ kFLCCodecType = 'flic',
+ kTargaCodecType = 'tga ',
+ kPNGCodecType = 'png ',
+ kTIFFCodecType = 'tiff', /* NOTE: despite what might seem obvious from the two constants*/
+ /* below and their names, they really are correct. 'yuvu' really */
+ /* does mean signed, and 'yuvs' really does mean unsigned. Really. */
+ kComponentVideoSigned = 'yuvu',
+ kComponentVideoUnsigned = 'yuvs',
+ kCMYKCodecType = 'cmyk',
+ kMicrosoftVideo1CodecType = 'msvc',
+ kSorensonCodecType = 'SVQ1',
+ kSorenson3CodecType = 'SVQ3', /* available in QuickTime 5 and later*/
+ kIndeo4CodecType = 'IV41',
+ kMPEG4VisualCodecType = 'mp4v',
+ k64ARGBCodecType = 'b64a',
+ k48RGBCodecType = 'b48r',
+ k32AlphaGrayCodecType = 'b32a',
+ k16GrayCodecType = 'b16g',
+ kMpegYUV420CodecType = 'myuv',
+ kYUV420CodecType = 'y420',
+ kSorensonYUV9CodecType = 'syv9',
+ k422YpCbCr8CodecType = '2vuy', /* Component Y'CbCr 8-bit 4:2:2 */
+ k444YpCbCr8CodecType = 'v308', /* Component Y'CbCr 8-bit 4:4:4 */
+ k4444YpCbCrA8CodecType = 'v408', /* Component Y'CbCrA 8-bit 4:4:4:4 */
+ k422YpCbCr16CodecType = 'v216', /* Component Y'CbCr 10,12,14,16-bit 4:2:2*/
+ k422YpCbCr10CodecType = 'v210', /* Component Y'CbCr 10-bit 4:2:2 */
+ k444YpCbCr10CodecType = 'v410', /* Component Y'CbCr 10-bit 4:4:4 */
+ k4444YpCbCrA8RCodecType = 'r408', /* Component Y'CbCrA 8-bit 4:4:4:4, rendering format. full range alpha, zero biased yuv*/
+ kJPEG2000CodecType = 'mjp2',
+ kPixletCodecType = 'pxlt',
+ kH264CodecType = 'avc1'
+};
+#endif
+
#endif //(_WIN32) || (__APPLE__)
#endif // __QUICKTIME_IMP_H__