141
149
static int qtVideoCodecCount = 12;
143
int quicktime_get_num_videocodecs() {
151
int quicktime_get_num_videocodecs()
144
153
return qtVideoCodecCount;
147
QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue) {
156
QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue)
148
158
if ((indexValue>=0) && (indexValue < qtVideoCodecCount))
149
159
return &qtVideoCodecList[indexValue];
154
int quicktime_rnatmpvalue_from_videocodectype(int codecType) {
164
int quicktime_rnatmpvalue_from_videocodectype(int codecType)
156
167
for (i=0;i<qtVideoCodecCount;i++) {
157
168
if (qtVideoCodecList[i].codecType == codecType)
176
188
static void CheckError(OSErr err, char *msg, ReportList *reports)
179
191
BKE_reportf(reports, RPT_ERROR, "%s: %d", msg, err);
255
269
// restore codecsettings to the quicktime component
256
if(qcd->cdParms && qcd->cdSize) {
270
if (qcd->cdParms && qcd->cdSize) {
257
271
myErr = SCSetSettingsFromAtomContainer((GraphicsExportComponent)qtdata->theComponent, (QTAtomContainer)myHandle);
258
272
if (myErr != noErr) {
259
273
BKE_reportf(reports, RPT_ERROR, "Quicktime: SCSetSettingsFromAtomContainer failed\n");
281
295
rd->qtcodecsettings.minTemporalQuality = (qtdata->aDataRateSetting.minTemporalQuality * 100) / codecLosslessQuality;
282
296
//Frame duration is already known (qtdata->aDataRateSetting.frameDuration)
285
300
BKE_reportf(reports, RPT_ERROR, "Quicktime: QT_GetCodecSettingsFromScene failed\n");
379
394
SCTemporalSettings gTemporalSettings;
380
395
OSErr err = noErr;
382
qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0);
383
qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0);
397
qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect);
398
qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect);
385
400
err = NewGWorldFromPtr( &qtexport->theGWorld,
386
401
k32ARGBPixelFormat,
399
414
// the new callback based api for proper encoding, but that's not
400
415
// really compatible with rendering out frames sequentially
401
416
gTemporalSettings = qtdata->gTemporalSettings;
402
if(qtdata->gSpatialSettings.codecType == kH264CodecType) {
403
if(gTemporalSettings.temporalQuality != codecMinQuality) {
417
if (qtdata->gSpatialSettings.codecType == kH264CodecType) {
418
if (gTemporalSettings.temporalQuality != codecMinQuality) {
404
419
BKE_reportf(reports, RPT_WARNING, "Only minimum quality compression supported for QuickTime H.264.\n");
405
420
gTemporalSettings.temporalQuality = codecMinQuality;
491
void filepath_qt(char *string, RenderData *rd) {
506
void filepath_qt(char *string, RenderData *rd)
494
510
if (string==0) return;
496
512
strcpy(string, rd->pic);
497
BLI_path_abs(string, G.sce);
513
BLI_path_abs(string, G.main->name);
499
515
BLI_make_existing_file(string);
501
517
if (BLI_strcasecmp(string + strlen(string) - 4, ".mov")) {
502
sprintf(txt, "%04d_%04d.mov", (rd->sfra) , (rd->efra) );
518
sprintf(txt, "%04d-%04d.mov", (rd->sfra) , (rd->efra) );
503
519
strcat(string, txt);
508
int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports) {
524
int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports)
509
526
OSErr err = noErr;
522
if(qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport");
539
if (qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport");
525
if(qtdata->theComponent) CloseComponent(qtdata->theComponent);
542
if (qtdata->theComponent) CloseComponent(qtdata->theComponent);
526
543
free_qtcomponentdata();
529
546
qtdata = MEM_callocN(sizeof(QuicktimeComponentData), "QuicktimeCodecDataExt");
531
if(rd->qtcodecdata == NULL || rd->qtcodecdata->cdParms == NULL) {
548
if (rd->qtcodecdata == NULL || rd->qtcodecdata->cdParms == NULL) {
532
549
get_qtcodec_settings(rd, reports);
534
552
qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType);
536
554
QT_GetCodecSettingsFromScene(rd, reports);
575
593
&qtexport->theMovie );
576
594
CheckError(err, "CreateMovieFile error", reports);
579
597
BKE_reportf(reports, RPT_ERROR, "Unable to create Quicktime movie: %s", name);
582
600
ExitMoviesOnThread();
585
604
//printf("Created QuickTime movie: %s\n", name);
587
606
QT_CreateMyVideoTrack(rectx, recty, reports);
594
int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports) {
613
int append_qt(struct RenderData *rd, int start_frame, int frame, int *pixels, int rectx, int recty, ReportList *reports)
595
615
QT_DoAddVideoSamplesToMedia(frame, pixels, rectx, recty, reports);
601
622
OSErr err = noErr;
602
623
short resId = movieInDataForkResID;
604
if(qtexport->theMovie) {
625
if (qtexport->theMovie) {
605
626
QT_EndCreateMyVideoTrack(NULL);
607
628
err = AddMovieResource (qtexport->theMovie, qtexport->resRefNum, &resId, qtexport->qtfilename);
613
634
err = UpdateMovieResource(qtexport->theMovie, qtexport->resRefNum, resId, qtexport->qtfilename);
614
635
CheckError(err, "UpdateMovieResource error", NULL);
616
if(qtexport->resRefNum) CloseMovieFile(qtexport->resRefNum);
637
if (qtexport->resRefNum) CloseMovieFile(qtexport->resRefNum);
618
639
DisposeMovie(qtexport->theMovie);
620
641
//printf("Finished QuickTime movie.\n");
623
ExitMoviesOnThread();
645
ExitMoviesOnThread();
626
649
MEM_freeN(qtexport);
632
void free_qtcomponentdata(void) {
634
if(qtdata->theComponent) CloseComponent(qtdata->theComponent);
655
void free_qtcomponentdata(void)
658
if (qtdata->theComponent) CloseComponent(qtdata->theComponent);
635
659
MEM_freeN(qtdata);
646
670
err = SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
647
671
CheckError(err, "SCGetInfo fr error", reports);
649
if( (rd->frs_sec == 24 || rd->frs_sec == 30 || rd->frs_sec == 60) &&
650
(qtdata->gTemporalSettings.frameRate == 1571553 ||
651
qtdata->gTemporalSettings.frameRate == 1964113 ||
652
qtdata->gTemporalSettings.frameRate == 3928227)) {;}
673
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))
654
681
if (rd->frs_sec_base > 0)
655
682
qtdata->gTemporalSettings.frameRate =
656
((float)(rd->frs_sec << 16) / rd->frs_sec_base) ;
683
((float)(rd->frs_sec << 16) / rd->frs_sec_base);
659
686
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
660
687
CheckError( err, "SCSetInfo error", reports );
662
if(qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
689
if (qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
663
690
qtdata->kVideoTimeScale = 24000;
664
691
qtdata->duration = 1001;
665
} else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
693
else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
666
694
qtdata->kVideoTimeScale = 30000;
667
695
qtdata->duration = 1001;
668
} else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
697
else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
669
698
qtdata->kVideoTimeScale = 60000;
670
699
qtdata->duration = 1001;
672
702
qtdata->kVideoTimeScale = (qtdata->gTemporalSettings.frameRate >> 16) * 100;
673
703
qtdata->duration = 100;
677
void quicktime_verify_image_type(RenderData *rd)
707
void quicktime_verify_image_type(RenderData *rd, ImageFormatData *imf)
679
if (rd->imtype == R_QUICKTIME) {
709
if (imf->imtype == R_IMF_IMTYPE_QUICKTIME) {
680
710
if ((rd->qtcodecsettings.codecType== 0) ||
681
711
(rd->qtcodecsettings.codecSpatialQuality <0) ||
682
712
(rd->qtcodecsettings.codecSpatialQuality > 100)) {
705
735
qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType);
707
737
// get previous selected codecsetting, from qtatom or detailed settings
708
if(rd->qtcodecdata && rd->qtcodecdata->cdParms) {
738
if (rd->qtcodecdata && rd->qtcodecdata->cdParms) {
709
739
QT_GetCodecSettingsFromScene(rd, reports);
711
742
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
712
743
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
713
744
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
756
787
qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType);
758
789
// get previous selected codecsetting, from qtatom or detailed settings
759
if(rd->qtcodecdata && rd->qtcodecdata->cdParms) {
790
if (rd->qtcodecdata && rd->qtcodecdata->cdParms) {
760
791
QT_GetCodecSettingsFromScene(rd, op->reports);
762
794
SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting);
763
795
SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings);
764
796
SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
814
846
QT_SaveCodecSettingsToScene(rd, op->reports);
816
848
// framerate jugglin'
817
if(qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
849
if (qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
818
850
qtdata->kVideoTimeScale = 24000;
819
851
qtdata->duration = 1001;
821
853
rd->frs_sec = 24;
822
854
rd->frs_sec_base = 1.001;
823
} else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
856
else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
824
857
qtdata->kVideoTimeScale = 30000;
825
858
qtdata->duration = 1001;
827
860
rd->frs_sec = 30;
828
861
rd->frs_sec_base = 1.001;
829
} else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
863
else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
830
864
qtdata->kVideoTimeScale = 60000;
831
865
qtdata->duration = 1001;
833
867
rd->frs_sec = 60;
834
868
rd->frs_sec_base = 1.001;
836
871
double fps = qtdata->gTemporalSettings.frameRate;
838
873
qtdata->kVideoTimeScale = 60000;
871
907
void SCENE_OT_render_data_set_quicktime_codec(wmOperatorType *ot)
873
909
/* identifiers */
874
ot->name= "Change codec";
875
ot->description= "Change Quicktime codec Settings";
876
ot->idname= "SCENE_OT_render_data_set_quicktime_codec";
910
ot->name = "Change codec";
911
ot->description = "Change Quicktime codec Settings";
912
ot->idname = "SCENE_OT_render_data_set_quicktime_codec";
878
914
/* api callbacks */
879
915
#if defined(__APPLE__) && defined(GHOST_COCOA)
880
916
ot->exec = cocoa_request_qtcodec_settings;
882
ot->exec= request_qtcodec_settings;
918
ot->exec = request_qtcodec_settings;
884
ot->poll= ED_operator_setqtcodec;
920
ot->poll = ED_operator_setqtcodec;
887
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
923
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
890
926
#endif /* USE_QTKIT */