82
79
#include <sys/stat.h> /* file permissions */
83
80
#endif /* __APPLE__ */
85
#define kMyCreatorType FOUR_CHAR_CODE('TVOD')
82
#define kMyCreatorType FOUR_CHAR_CODE('TVOD')
89
static void QT_StartAddVideoSamplesToMedia (const Rect *trackFrame, int rectx, int recty, struct ReportList *reports);
90
static void QT_DoAddVideoSamplesToMedia (int frame, int *pixels, int rectx, int recty, struct ReportList *reports);
91
static void QT_EndAddVideoSamplesToMedia (void);
92
static void QT_CreateMyVideoTrack (int rectx, int recty, struct ReportList *reports);
93
static void QT_EndCreateMyVideoTrack (struct ReportList *reports);
86
static void QT_StartAddVideoSamplesToMedia(const Rect *trackFrame, int rectx, int recty, struct ReportList *reports);
87
static void QT_DoAddVideoSamplesToMedia(int frame, int *pixels, int rectx, int recty, struct ReportList *reports);
88
static void QT_EndAddVideoSamplesToMedia(void);
89
static void QT_CreateMyVideoTrack(int rectx, int recty, struct ReportList *reports);
90
static void QT_EndCreateMyVideoTrack(struct ReportList *reports);
94
91
static void check_renderbutton_framerate(struct RenderData *rd, struct ReportList *reports);
95
92
static int get_qtcodec_settings(struct RenderData *rd, struct ReportList *reports);
97
94
typedef struct QuicktimeExport {
108
PixMapHandle thePixMap;
109
ImageDescription **anImageDescription;
111
ImBuf *ibuf; //imagedata for Quicktime's Gworld
112
ImBuf *ibuf2; //copy of renderdata, to be Y-flipped
105
PixMapHandle thePixMap;
106
ImageDescription **anImageDescription;
108
ImBuf *ibuf; /* imagedata for Quicktime's Gworld */
109
ImBuf *ibuf2; /* copy of renderdata, to be Y-flipped */
114
111
} QuicktimeExport;
116
113
typedef struct QuicktimeComponentData {
118
ComponentInstance theComponent;
115
ComponentInstance theComponent;
119
116
SCTemporalSettings gTemporalSettings;
120
117
SCSpatialSettings gSpatialSettings;
121
118
SCDataRateSettings aDataRateSetting;
123
long kVideoTimeScale;
120
long kVideoTimeScale;
125
122
} QuicktimeComponentData;
127
124
static struct QuicktimeExport *qtexport;
128
125
static struct QuicktimeComponentData *qtdata;
132
129
/* RNA functions */
212
210
qcd = rd->qtcodecdata = MEM_callocN(sizeof(QuicktimeCodecData), "QuicktimeCodecData");
215
// obtain all current codec settings
216
SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
217
SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
218
SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
213
/* obtain all current codec settings */
214
SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
215
SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
216
SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
220
// retreive codecdata from quicktime in a atomcontainer
218
/* retreive codecdata from quicktime in a atomcontainer */
221
219
myErr = SCGetSettingsAsAtomContainer(qtdata->theComponent, &myContainer);
222
220
if (myErr != noErr) {
223
BKE_reportf(reports, RPT_ERROR, "Quicktime: SCGetSettingsAsAtomContainer failed\n");
221
BKE_report(reports, RPT_ERROR, "Quicktime: SCGetSettingsAsAtomContainer failed");
227
// get the size of the atomcontainer
225
/* get the size of the atomcontainer */
228
226
mySize = GetHandleSize((Handle)myContainer);
230
// lock and convert the atomcontainer to a *valid* pointer
228
/* lock and convert the atomcontainer to a *valid* pointer */
231
229
QTLockContainer(myContainer);
232
230
myPtr = *(Handle)myContainer;
234
// copy the Quicktime data into the blender qtcodecdata struct
232
/* copy the Quicktime data into the blender qtcodecdata struct */
236
234
qcd->cdParms = MEM_mallocN(mySize, "qt.cdParms");
237
235
memcpy(qcd->cdParms, myPtr, mySize);
238
236
qcd->cdSize = mySize;
240
GetCodecInfo (&ci, qtdata->gSpatialSettings.codecType, 0);
238
GetCodecInfo(&ci, qtdata->gSpatialSettings.codecType, 0);
243
BKE_reportf(reports, RPT_ERROR, "Quicktime: QT_SaveCodecSettingsToScene failed\n");
241
BKE_report(reports, RPT_ERROR, "Quicktime: QT_SaveCodecSettingsToScene failed");
246
244
QTUnlockContainer(myContainer);
256
254
static OSErr QT_GetCodecSettingsFromScene(RenderData *rd, ReportList *reports)
258
Handle myHandle = NULL;
259
ComponentResult myErr = noErr;
256
Handle myHandle = NULL;
257
ComponentResult myErr = noErr;
261
259
QuicktimeCodecData *qcd = rd->qtcodecdata;
263
// if there is codecdata in the blendfile, convert it to a Quicktime handle
261
/* if there is codecdata in the blendfile, convert it to a Quicktime handle */
265
263
myHandle = NewHandle(qcd->cdSize);
266
PtrToHand( qcd->cdParms, &myHandle, qcd->cdSize);
264
PtrToHand(qcd->cdParms, &myHandle, qcd->cdSize);
269
// restore codecsettings to the quicktime component
267
/* restore codecsettings to the quicktime component */
270
268
if (qcd->cdParms && qcd->cdSize) {
271
269
myErr = SCSetSettingsFromAtomContainer((GraphicsExportComponent)qtdata->theComponent, (QTAtomContainer)myHandle);
272
270
if (myErr != noErr) {
273
BKE_reportf(reports, RPT_ERROR, "Quicktime: SCSetSettingsFromAtomContainer failed\n");
271
BKE_report(reports, RPT_ERROR, "Quicktime: SCSetSettingsFromAtomContainer failed");
277
// update runtime codecsettings for use with the codec dialog
278
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
279
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
280
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
283
//Fill the render QuicktimeCodecSettigns struct
275
/* update runtime codecsettings for use with the codec dialog */
276
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
277
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
278
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
281
/* Fill the render QuicktimeCodecSettigns struct */
284
282
rd->qtcodecsettings.codecTemporalQuality = (qtdata->gTemporalSettings.temporalQuality * 100) / codecLosslessQuality;
285
//Do not override scene frame rate (qtdata->gTemporalSettings.framerate)
283
/* Do not override scene frame rate (qtdata->gTemporalSettings.framerate) */
286
284
rd->qtcodecsettings.keyFrameRate = qtdata->gTemporalSettings.keyFrameRate;
288
286
rd->qtcodecsettings.codecType = qtdata->gSpatialSettings.codecType;
346
344
trackFrame.bottom = recty;
347
345
trackFrame.right = rectx;
349
qtexport->theTrack = NewMovieTrack (qtexport->theMovie,
350
FixRatio(trackFrame.right,1),
351
FixRatio(trackFrame.bottom,1),
353
CheckError( GetMoviesError(), "NewMovieTrack error", reports );
355
// SetIdentityMatrix(&myMatrix);
356
// ScaleMatrix(&myMatrix, fixed1, Long2Fix(-1), 0, 0);
357
// TranslateMatrix(&myMatrix, 0, Long2Fix(trackFrame.bottom));
358
// SetMovieMatrix(qtexport->theMovie, &myMatrix);
360
qtexport->theMedia = NewTrackMedia (qtexport->theTrack,
362
qtdata->kVideoTimeScale,
365
CheckError( GetMoviesError(), "NewTrackMedia error", reports );
367
err = BeginMediaEdits (qtexport->theMedia);
368
CheckError( err, "BeginMediaEdits error", reports );
370
QT_StartAddVideoSamplesToMedia (&trackFrame, rectx, recty, reports);
347
qtexport->theTrack = NewMovieTrack(qtexport->theMovie,
348
FixRatio(trackFrame.right, 1),
349
FixRatio(trackFrame.bottom, 1),
351
CheckError(GetMoviesError(), "NewMovieTrack error", reports);
353
// SetIdentityMatrix(&myMatrix);
354
// ScaleMatrix(&myMatrix, fixed1, Long2Fix(-1), 0, 0);
355
// TranslateMatrix(&myMatrix, 0, Long2Fix(trackFrame.bottom));
356
// SetMovieMatrix(qtexport->theMovie, &myMatrix);
358
qtexport->theMedia = NewTrackMedia(qtexport->theTrack,
360
qtdata->kVideoTimeScale,
363
CheckError(GetMoviesError(), "NewTrackMedia error", reports);
365
err = BeginMediaEdits(qtexport->theMedia);
366
CheckError(err, "BeginMediaEdits error", reports);
368
QT_StartAddVideoSamplesToMedia(&trackFrame, rectx, recty, reports);
376
374
OSErr err = noErr;
378
QT_EndAddVideoSamplesToMedia ();
380
err = EndMediaEdits (qtexport->theMedia);
381
CheckError( err, "EndMediaEdits error", reports );
383
err = InsertMediaIntoTrack (qtexport->theTrack,
384
kTrackStart,/* track start time */
385
kMediaStart,/* media start time */
386
GetMediaDuration (qtexport->theMedia),
388
CheckError( err, "InsertMediaIntoTrack error", reports );
376
QT_EndAddVideoSamplesToMedia();
378
err = EndMediaEdits(qtexport->theMedia);
379
CheckError(err, "EndMediaEdits error", reports);
381
err = InsertMediaIntoTrack(qtexport->theTrack,
382
kTrackStart, /* track start time */
383
kMediaStart, /* media start time */
384
GetMediaDuration(qtexport->theMedia),
386
CheckError(err, "InsertMediaIntoTrack error", reports);
392
static void QT_StartAddVideoSamplesToMedia (const Rect *trackFrame, int rectx, int recty, ReportList *reports)
390
static void QT_StartAddVideoSamplesToMedia(const Rect *trackFrame, int rectx, int recty, ReportList *reports)
394
392
SCTemporalSettings gTemporalSettings;
395
393
OSErr err = noErr;
397
qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect);
398
qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect);
395
qtexport->ibuf = IMB_allocImBuf(rectx, recty, 32, IB_rect);
396
qtexport->ibuf2 = IMB_allocImBuf(rectx, recty, 32, IB_rect);
400
err = NewGWorldFromPtr( &qtexport->theGWorld,
404
(Ptr)qtexport->ibuf->rect,
406
CheckError (err, "NewGWorldFromPtr error", reports);
398
err = NewGWorldFromPtr(&qtexport->theGWorld,
402
(Ptr)qtexport->ibuf->rect,
404
CheckError(err, "NewGWorldFromPtr error", reports);
408
406
qtexport->thePixMap = GetGWorldPixMap(qtexport->theGWorld);
409
407
LockPixels(qtexport->thePixMap);
411
SCDefaultPixMapSettings (qtdata->theComponent, qtexport->thePixMap, true);
409
SCDefaultPixMapSettings(qtdata->theComponent, qtexport->thePixMap, true);
413
// workaround for crash with H.264, which requires an upgrade to
414
// the new callback based api for proper encoding, but that's not
415
// really compatible with rendering out frames sequentially
411
/* workaround for crash with H.264, which requires an upgrade to
412
* the new callback based api for proper encoding, but that's not
413
* really compatible with rendering out frames sequentially */
416
414
gTemporalSettings = qtdata->gTemporalSettings;
417
415
if (qtdata->gSpatialSettings.codecType == kH264CodecType) {
418
416
if (gTemporalSettings.temporalQuality != codecMinQuality) {
419
BKE_reportf(reports, RPT_WARNING, "Only minimum quality compression supported for QuickTime H.264.\n");
417
BKE_report(reports, RPT_WARNING, "Only minimum quality compression supported for Quicktime H.264");
420
418
gTemporalSettings.temporalQuality = codecMinQuality;
424
SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &gTemporalSettings);
425
SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
426
SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
422
SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &gTemporalSettings);
423
SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
424
SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
428
426
err = SCCompressSequenceBegin(qtdata->theComponent, qtexport->thePixMap, NULL, &qtexport->anImageDescription);
429
CheckError (err, "SCCompressSequenceBegin error", reports );
427
CheckError(err, "SCCompressSequenceBegin error", reports);
433
static void QT_DoAddVideoSamplesToMedia (int frame, int *pixels, int rectx, int recty, ReportList *reports)
431
static void QT_DoAddVideoSamplesToMedia(int frame, int *pixels, int rectx, int recty, ReportList *reports)
440
438
unsigned char *from, *to;
444
Handle compressedData;
448
//copy and flip renderdata
449
memcpy(qtexport->ibuf2->rect, pixels, 4*rectx*recty);
442
Handle compressedData;
446
/* copy and flip renderdata */
447
memcpy(qtexport->ibuf2->rect, pixels, 4 * rectx * recty);
450
448
IMB_flipy(qtexport->ibuf2);
452
//get pointers to parse bitmapdata
450
/* get pointers to parse bitmapdata */
453
451
myPtr = GetPixBaseAddr(qtexport->thePixMap);
454
452
imageRect = (**qtexport->thePixMap).bounds;
456
454
from = (unsigned char *) qtexport->ibuf2->rect;
457
455
to = (unsigned char *) myPtr;
459
//parse RGBA bitmap into Quicktime's ARGB GWorld
457
/* parse RGBA bitmap into Quicktime's ARGB GWorld */
460
458
boxsize = rectx * recty;
461
for ( index = 0; index < boxsize; index++) {
459
for (index = 0; index < boxsize; index++) {
469
467
err = SCCompressSequenceFrame(qtdata->theComponent,
475
473
CheckError(err, "SCCompressSequenceFrame error", reports);
477
475
err = AddMediaSample(qtexport->theMedia,
482
(SampleDescriptionHandle)qtexport->anImageDescription,
480
(SampleDescriptionHandle)qtexport->anImageDescription,
486
484
CheckError(err, "AddMediaSample error", reports);
490
static void QT_EndAddVideoSamplesToMedia (void)
488
static void QT_EndAddVideoSamplesToMedia(void)
492
490
SCCompressSequenceEnd(qtdata->theComponent);
494
492
UnlockPixels(qtexport->thePixMap);
495
493
if (qtexport->theGWorld)
496
DisposeGWorld (qtexport->theGWorld);
494
DisposeGWorld(qtexport->theGWorld);
498
496
if (qtexport->ibuf)
499
497
IMB_freeImBuf(qtexport->ibuf);
665
663
static void check_renderbutton_framerate(RenderData *rd, ReportList *reports)
667
// to keep float framerates consistent between the codec dialog and frs/sec button.
665
/* to keep float framerates consistent between the codec dialog and frs/sec button. */
670
err = SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
668
err = SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
671
669
CheckError(err, "SCGetInfo fr error", reports);
673
671
if ( (rd->frs_sec == 24 || rd->frs_sec == 30 || rd->frs_sec == 60) &&
674
(qtdata->gTemporalSettings.frameRate == 1571553 ||
675
qtdata->gTemporalSettings.frameRate == 1964113 ||
676
qtdata->gTemporalSettings.frameRate == 3928227))
672
(qtdata->gTemporalSettings.frameRate == 1571553 ||
673
qtdata->gTemporalSettings.frameRate == 1964113 ||
674
qtdata->gTemporalSettings.frameRate == 3928227))
681
679
if (rd->frs_sec_base > 0)
682
680
qtdata->gTemporalSettings.frameRate =
683
((float)(rd->frs_sec << 16) / rd->frs_sec_base);
681
((float)(rd->frs_sec << 16) / rd->frs_sec_base);
686
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
687
CheckError( err, "SCSetInfo error", reports );
684
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
685
CheckError(err, "SCSetInfo error", reports);
689
if (qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
687
if (qtdata->gTemporalSettings.frameRate == 1571553) { /* 23.98 fps */
690
688
qtdata->kVideoTimeScale = 24000;
691
689
qtdata->duration = 1001;
693
else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
691
else if (qtdata->gTemporalSettings.frameRate == 1964113) { /* 29.97 fps */
694
692
qtdata->kVideoTimeScale = 30000;
695
693
qtdata->duration = 1001;
697
else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
695
else if (qtdata->gTemporalSettings.frameRate == 3928227) { /* 59.94 fps */
698
696
qtdata->kVideoTimeScale = 60000;
699
697
qtdata->duration = 1001;
724
722
int get_qtcodec_settings(RenderData *rd, ReportList *reports)
726
724
OSErr err = noErr;
727
// erase any existing codecsetting
725
/* erase any existing codecsetting */
729
727
if (qtdata->theComponent) CloseComponent(qtdata->theComponent);
730
728
free_qtcomponentdata();
734
732
qtdata = MEM_callocN(sizeof(QuicktimeComponentData), "QuicktimeComponentData");
735
733
qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType);
737
// get previous selected codecsetting, from qtatom or detailed settings
735
/* get previous selected codecsetting, from qtatom or detailed settings */
738
736
if (rd->qtcodecdata && rd->qtcodecdata->cdParms) {
739
737
QT_GetCodecSettingsFromScene(rd, reports);
742
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
743
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
744
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
740
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
741
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
742
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
746
744
qtdata->gSpatialSettings.codecType = rd->qtcodecsettings.codecType;
747
745
qtdata->gSpatialSettings.codec = (CodecComponent)rd->qtcodecsettings.codec;
748
qtdata->gSpatialSettings.spatialQuality = (rd->qtcodecsettings.codecSpatialQuality * codecLosslessQuality) /100;
749
qtdata->gTemporalSettings.temporalQuality = (rd->qtcodecsettings.codecTemporalQuality * codecLosslessQuality) /100;
746
qtdata->gSpatialSettings.spatialQuality = (rd->qtcodecsettings.codecSpatialQuality * codecLosslessQuality) / 100;
747
qtdata->gTemporalSettings.temporalQuality = (rd->qtcodecsettings.codecTemporalQuality * codecLosslessQuality) / 100;
750
748
qtdata->gTemporalSettings.keyFrameRate = rd->qtcodecsettings.keyFrameRate;
751
749
qtdata->aDataRateSetting.dataRate = rd->qtcodecsettings.bitRate;
752
750
qtdata->gSpatialSettings.depth = rd->qtcodecsettings.colorDepth;
754
752
qtdata->aDataRateSetting.minTemporalQuality = (rd->qtcodecsettings.minTemporalQuality * codecLosslessQuality) / 100;
756
754
qtdata->aDataRateSetting.frameDuration = rd->frs_sec;
757
SetMovieTimeScale(qtexport->theMovie, rd->frs_sec_base*1000);
760
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
755
SetMovieTimeScale(qtexport->theMovie, rd->frs_sec_base * 1000);
758
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
761
759
CheckError(err, "SCSetInfo1 error", reports);
762
err = SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
760
err = SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
763
761
CheckError(err, "SCSetInfo2 error", reports);
764
err = SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
762
err = SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
765
763
CheckError(err, "SCSetInfo3 error", reports);
773
771
static int request_qtcodec_settings(bContext *C, wmOperator *op)
776
774
Scene *scene = CTX_data_scene(C);
777
775
RenderData *rd = &scene->r;
779
// erase any existing codecsetting
777
/* erase any existing codecsetting */
781
779
if (qtdata->theComponent) CloseComponent(qtdata->theComponent);
782
780
free_qtcomponentdata();
786
784
qtdata = MEM_callocN(sizeof(QuicktimeComponentData), "QuicktimeComponentData");
787
785
qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType);
789
// get previous selected codecsetting, from qtatom or detailed settings
787
/* get previous selected codecsetting, from qtatom or detailed settings */
790
788
if (rd->qtcodecdata && rd->qtcodecdata->cdParms) {
791
789
QT_GetCodecSettingsFromScene(rd, op->reports);
794
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
795
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
796
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
792
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
793
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
794
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
798
796
qtdata->gSpatialSettings.codecType = rd->qtcodecsettings.codecType;
799
797
qtdata->gSpatialSettings.codec = (CodecComponent)rd->qtcodecsettings.codec;
800
qtdata->gSpatialSettings.spatialQuality = (rd->qtcodecsettings.codecSpatialQuality * codecLosslessQuality) /100;
801
qtdata->gTemporalSettings.temporalQuality = (rd->qtcodecsettings.codecTemporalQuality * codecLosslessQuality) /100;
798
qtdata->gSpatialSettings.spatialQuality = (rd->qtcodecsettings.codecSpatialQuality * codecLosslessQuality) / 100;
799
qtdata->gTemporalSettings.temporalQuality = (rd->qtcodecsettings.codecTemporalQuality * codecLosslessQuality) / 100;
802
800
qtdata->gTemporalSettings.keyFrameRate = rd->qtcodecsettings.keyFrameRate;
803
801
qtdata->gTemporalSettings.frameRate = ((float)(rd->frs_sec << 16) / rd->frs_sec_base);
804
802
qtdata->aDataRateSetting.dataRate = rd->qtcodecsettings.bitRate;
806
804
qtdata->aDataRateSetting.minSpatialQuality = (rd->qtcodecsettings.minSpatialQuality * codecLosslessQuality) / 100;
807
805
qtdata->aDataRateSetting.minTemporalQuality = (rd->qtcodecsettings.minTemporalQuality * codecLosslessQuality) / 100;
809
qtdata->aDataRateSetting.frameDuration = rd->frs_sec;
807
qtdata->aDataRateSetting.frameDuration = rd->frs_sec;
811
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
809
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
812
810
CheckError(err, "SCSetInfo1 error", op->reports);
813
err = SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
811
err = SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
814
812
CheckError(err, "SCSetInfo2 error", op->reports);
815
err = SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
813
err = SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
816
814
CheckError(err, "SCSetInfo3 error", op->reports);
818
// put up the dialog box - it needs to be called from the main thread
816
/* put up the dialog box - it needs to be called from the main thread */
819
817
err = SCRequestSequenceSettings(qtdata->theComponent);
821
819
if (err == scUserCancelled) {
822
820
return OPERATOR_FINISHED;
825
// update runtime codecsettings for use with the codec dialog
826
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
827
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
828
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
831
//Fill the render QuicktimeCodecSettings struct
823
/* update runtime codecsettings for use with the codec dialog */
824
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
825
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
826
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
829
/* Fill the render QuicktimeCodecSettings struct */
832
830
rd->qtcodecsettings.codecTemporalQuality = (qtdata->gTemporalSettings.temporalQuality * 100) / codecLosslessQuality;
833
//Do not override scene frame rate (qtdata->gTemporalSettings.framerate)
831
/* Do not override scene frame rate (qtdata->gTemporalSettings.framerate) */
834
832
rd->qtcodecsettings.keyFrameRate = qtdata->gTemporalSettings.keyFrameRate;
836
834
rd->qtcodecsettings.codecType = qtdata->gSpatialSettings.codecType;