source: trunk/platform/generic/shooting.c @ 813

Revision 813, 36.9 KB checked in by reyalp, 4 years ago (diff)

jpeg quality override from ADamb, allows "super fine" on sx200. http://chdk.setepontos.com/index.php/topic,3994.msg40880.html#msg40880

  • Property svn:eol-style set to native
Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "math.h"
6#include "stdlib.h"
7#include "conf.h"
8
9#define USE_FILE_COUNTER_FOR_EXP_COUNTING
10
11#define SS_SIZE (sizeof(shutter_speeds_table)/sizeof(shutter_speeds_table[0]))
12#define SSID_MIN (shutter_speeds_table[0].id)
13#define SSID_MAX (shutter_speeds_table[SS_SIZE-1].id)
14
15#define AS_SIZE (sizeof(aperture_sizes_table)/sizeof(aperture_sizes_table[0]))
16#define ASID_MIN (aperture_sizes_table[0].id)
17#define ASID_MAX (aperture_sizes_table[AS_SIZE-1].id)
18
19#define AV96_MIN (aperture_sizes_table[0].prop_id)
20#define AV96_MAX (aperture_sizes_table[AS_SIZE-1].prop_id)
21
22#define ISO_SIZE (sizeof(iso_table)/sizeof(iso_table[0]))
23#define ISO_MIN (iso_table[0].id)
24#define ISO_MAX (iso_table[ISO_SIZE-1].id)
25#define ISO_MIN_VALUE (iso_table[1-iso_table[0].id].prop_id)
26
27/*define PROPCASE_CONT_MODE_SHOOT_COUNT                 218*/
28static short iso_market_base=0;
29//static short iso_base=0;
30static short sv96_base=0;
31static short svm96_base=0;
32static short sv96_base_tmp=0;
33//static short override_iso=0;
34static const double sqrt2=1.4142135623731;//square root from 2
35static const double log_2=0.6931471805599;//natural logarithm of 2
36static const double k=12.5;//K is the reflected-light meter calibration constant
37static const short koef[] = {0, 1,10,100,1000};
38static const float shutter_koef[] = {0, 0.00001, 0.0001,0.001,0.01,0.1,1,10,100,1000};
39static const char * expo_shift[] = { "Off", "1/3Ev","2/3Ev", "1Ev", "1 1/3Ev", "1 2/3Ev", "2Ev", "2 1/3Ev", "2 2/3Ev", "3Ev", "3 1/3Ev", "3 2/3Ev", "4Ev"};
40const char* tv_override[]={
41#ifdef CAM_EXT_TV_RANGE
42    // add very long time exposures as approximately powers of 2, adding 15 exposures
43    "2048","1625","1290","1024","812","645","512","406","322","256","203","161","128","101","80",
44#endif
45    "64","50.8", "40.3", "32", "25.4","20","16", "12.7", "10","8", "6.3","5","4","3.2", "2.5","2", "1.6", "1.3", "1", "0.8", "0.6", "0.5", "0.4", "0.3", "1/4", "1/5", "1/6", "1/8", "1/10", "1/13", "1/15", "1/20", "1/25", "1/30", "1/40", "1/50", "1/60", "1/80", "1/100", "1/125", "1/160", "1/200", "1/250", "1/320", "1/400", "1/500", "1/640","1/800", "1/1000", "1/1250", "1/1600","1/2000","1/2500","1/3200","1/4000", "1/5000", "1/6400", "1/8000", "1/10000", "1/12500", "1/16000", "1/20000", "1/25000", "1/32000", "1/40000", "1/50000", "1/64000","1/80000", "1/100k"};
46const int tv_override_amount = sizeof(tv_override)/sizeof(tv_override[0]);
47
48#if CAM_EXT_TV_RANGE
49const int tv_override_zero_shift = 18+15;
50#else
51const int tv_override_zero_shift = 18;
52#endif
53static const char * expo_type[] = { "+/-", "-","+"};
54
55static PHOTO_PARAM photo_param_put_off;
56
57static EXPO_BRACKETING_VALUES bracketing;
58
59//***********************
60/*
61
62static char debug_str[60];
63
64void debug_char(char * deb_str)
65{
66 short debug_str_length=strlen(debug_str);
67 if     (debug_str_length>50) strcpy(debug_str, "");
68 sprintf(debug_str+debug_str_length, "%s", deb_str);
69}
70
71void debug_init()
72{
73 strcpy(debug_str, "");
74}
75
76
77void debug_int(int deb_str)
78{
79 short debug_str_length=strlen(debug_str);
80 if     (debug_str_length>50) strcpy(debug_str, "");
81 sprintf(debug_str+debug_str_length, "%d", deb_str);
82}
83
84
85void debug(char * deb_str, int deb_int)
86{
87 short debug_str_length=strlen(debug_str);
88 if     (debug_str_length>50) strcpy(debug_str, "");
89 sprintf(debug_str+debug_str_length, "%s", deb_str);
90 sprintf(debug_str+strlen(debug_str), "%d", deb_int);
91}
92
93char * get_debug()
94{
95 return debug_str;
96}
97*/
98//***********************
99
100int shooting_get_user_tv_id()
101{
102#if CAM_HAS_USER_TV_MODES
103    short tvv;
104    long i;
105    _GetPropertyCase(PROPCASE_USER_TV, &tvv, sizeof(tvv));
106    for (i=0;i<SS_SIZE;i++){
107        if (shutter_speeds_table[i].prop_id == tvv)
108            return shutter_speeds_table[i].id;
109    }
110#endif       
111    return 0;
112}
113
114short shooting_get_is_mode()
115{
116    short ism = 0;
117    _GetPropertyCase(PROPCASE_IS_MODE, &ism, sizeof(ism));
118    return ism;
119}
120
121
122const ShutterSpeed *shooting_get_tv_line()
123{
124    short tvv;
125    long i;
126    _GetPropertyCase(PROPCASE_USER_TV, &tvv, sizeof(tvv));
127    for (i=0;i<SS_SIZE;i++){
128           if (shutter_speeds_table[i].prop_id == tvv)
129            return &shutter_speeds_table[i];
130    }
131    return 0;
132}
133
134void shooting_set_user_tv_by_id(int v)
135{
136#if CAM_HAS_USER_TV_MODES
137if ((mode_get()&MODE_MASK) != MODE_PLAY){
138    long i;
139//    if ((v<SSID_MIN) || (v>SSID_MAX))
140//      return;
141 for (i=0;i<SS_SIZE;i++){
142        if (shutter_speeds_table[i].id == v){
143            short vv = shutter_speeds_table[i].prop_id;
144            _SetPropertyCase(PROPCASE_USER_TV, &vv, sizeof(vv));
145            //_SetPropertyCase(PROPCASE_TV, &vv, sizeof(vv));
146            return;
147         }
148 }
149}
150#endif
151}
152void shooting_set_prop(int id, int v)
153{
154   short vv = v;
155   _SetPropertyCase(id, &vv, sizeof(vv));
156   return;
157}
158
159int shooting_get_prop(int id)
160{
161    short vv;
162    _GetPropertyCase(id, &vv, sizeof(vv));
163    return vv;
164}
165
166short shooting_get_canon_iso_mode()
167{
168    short isom;
169    _GetPropertyCase(PROPCASE_ISO_MODE, &isom, sizeof(isom));
170     return isom;
171}
172
173
174int shooting_get_iso_mode()
175{
176    short isov;
177    long i;
178    _GetPropertyCase(PROPCASE_ISO_MODE, &isov, sizeof(isov));
179    for (i=0;i<ISO_SIZE;i++){
180                        if (iso_table[i].prop_id == isov)
181                         return iso_table[i].id;
182    }
183    return 0;
184}
185
186void shooting_set_user_tv_by_id_rel(int v)
187{
188#if CAM_HAS_USER_TV_MODES
189if ((mode_get()&MODE_MASK) != MODE_PLAY){
190    int cv = shooting_get_user_tv_id();
191    shooting_set_user_tv_by_id(cv+v);
192}
193#endif   
194}
195
196int shooting_get_user_av_id()
197{
198#if CAM_HAS_IRIS_DIAPHRAGM
199    short avv;
200    long i;
201    _GetPropertyCase(PROPCASE_USER_AV, &avv, sizeof(avv));
202    for (i=0;i<AS_SIZE;i++){
203                        if (aperture_sizes_table[i].prop_id == avv)
204                         return aperture_sizes_table[i].id;
205    }
206#endif   
207    return 0;
208}
209
210short shooting_get_real_aperture() {
211//#if !CAM_HAS_IRIS_DIAPHRAGM
212//    return shooting_get_min_real_aperture();
213//#else
214//I hope that GetCurrentAvValue is correct for ixus70_sd1000 ixus700_sd500 now
215    return shooting_get_aperture_from_av96(_GetCurrentAvValue());
216//#endif
217}
218
219short shooting_get_aperture_from_av96(short av96) {
220        if (av96) return (short)((pow(sqrt2, ((double)av96)/96.0))*100.0);
221        else return -1;
222}
223
224short shooting_get_min_real_aperture() {
225         short av96;
226        _GetPropertyCase(PROPCASE_MIN_AV, &av96, sizeof(av96));
227        if (av96) return shooting_get_aperture_from_av96(av96);
228        else return shooting_get_real_aperture();
229}
230
231short shooting_get_iso_from_sv96(short sv96)
232{
233    return (short)(pow(2, (((double) sv96+168.0)/96.0)));
234}
235
236short shooting_get_iso_real()
237{
238    short sv;
239    _GetPropertyCase(PROPCASE_SV, &sv, sizeof(sv));
240    if (sv == 0) {
241     return 0;
242    }
243    return shooting_get_iso_from_sv96(sv);
244}
245
246short shooting_get_svm96()
247{
248    short  sv;
249     _GetPropertyCase(PROPCASE_SV_MARKET, &sv, sizeof(sv));
250     return sv;
251}
252
253short shooting_get_sv96()
254{
255    short  sv;
256     _GetPropertyCase(PROPCASE_SV, &sv, sizeof(sv));
257     return sv;
258}
259
260short shooting_get_base_sv96()
261{
262   short dsv,sv;
263   if (shooting_get_canon_iso_mode()<50) {     
264       _GetPropertyCase(PROPCASE_DELTA_SV, &dsv, sizeof(dsv));
265       _GetPropertyCase(PROPCASE_SV, &sv, sizeof(sv));
266       sv96_base=(sv-dsv);
267   }
268   return sv96_base;
269}
270
271short shooting_get_sv96_from_iso(short iso)
272{
273  if  (iso>0)
274    return (short)(log(pow(2.0,(-7.0/4.0))*(double)(iso))*96.0/(log_2));
275  return 0; 
276}
277
278short shooting_get_svm96_from_iso(short iso)
279{
280   if  (iso>0) return (short)(log((double)(iso)*32.0/100.0)*96.0/(log_2));
281   return 0;   
282
283
284short shooting_get_iso_market_from_svm96(short svm96)
285{
286        if (svm96>0 )
287                return (short)((double)pow(2, (((double)svm96)/96.0))*100.0/32.0);
288        return 0;       
289}
290
291short shooting_get_iso_market_base()
292{
293//if ((iso_market_base==0) && (shooting_get_iso_mode() <= 0)) {
294//       iso_market_base=(short)shooting_get_iso_market_from_svm96(shooting_get_svm96());
295// }
296 //return iso_market_base;
297  if (iso_market_base==0) {
298      if (ISO_MIN_VALUE==50) iso_market_base=50;
299      else iso_market_base=100;
300     }
301  return iso_market_base;       
302}
303
304short shooting_get_svm96_base()
305{
306        if (svm96_base==0) svm96_base=shooting_get_svm96_from_iso(shooting_get_iso_market_base());
307        return svm96_base;
308}
309
310short shooting_get_iso_base()
311{
312        sv96_base=shooting_get_base_sv96();
313        if (sv96_base!=0) return shooting_get_iso_from_sv96(sv96_base);
314        else return 0;
315}
316
317// AUTOISO:EXIF
318short shooting_get_iso_market()
319{
320    //double koef;
321    short iso_mode=shooting_get_canon_iso_mode();
322    if ((iso_mode < 50) || (conf.iso_override_koef && conf.iso_override_value) || (conf.iso_bracket_koef && conf.iso_bracket_value))
323     {
324      short iso_b=shooting_get_iso_base();
325      if (iso_b) return (short)((shooting_get_iso_market_base()*shooting_get_iso_real())/iso_b);
326     }
327    return iso_mode;
328}
329
330void shooting_set_sv96(short sv96, short is_now){
331  short dsv96=0, iso_mode=shooting_get_canon_iso_mode();       
332if ((mode_get()&MODE_MASK) != MODE_PLAY){
333  if (is_now)  {
334    if (iso_mode<50) dsv96 =sv96-shooting_get_base_sv96();
335    else if (sv96_base) dsv96=sv96-sv96_base;
336        else if (sv96_base_tmp) dsv96=sv96-sv96_base_tmp; 
337        else
338         {
339         sv96_base_tmp= (short)((shooting_get_svm96_base()*shooting_get_sv96())/shooting_get_svm96());   
340         dsv96=sv96-sv96_base_tmp;
341         }       
342    while ((shooting_is_flash_ready()!=1) || (focus_busy));
343    short svm96_base =shooting_get_svm96_base();
344    if (iso_mode>=50) shooting_set_iso_mode(0);
345    _SetPropertyCase(PROPCASE_SV_MARKET, &svm96_base, sizeof(svm96_base));
346    _SetPropertyCase(PROPCASE_SV, &sv96, sizeof(sv96));
347    _SetPropertyCase(PROPCASE_DELTA_SV, &dsv96, sizeof(dsv96));
348  }
349  else   photo_param_put_off.sv96=sv96;
350}
351}
352
353/*void shooting_set_iso_real_delta_from_base(int diso)
354{
355 return;
356 int iso=(int)((short)shooting_get_iso_base()+diso);
357 
358 if (iso>0) {
359    shooting_set_sv96((short)(shooting_get_sv96_from_iso(iso)));
360  }
361}*/
362
363void shooting_set_iso_real(short iso, short is_now)
364{
365if ((mode_get()&MODE_MASK) != MODE_PLAY){
366        if (iso>0) shooting_set_sv96(shooting_get_sv96_from_iso(iso), is_now);
367}
368}
369
370short shooting_get_bv96()
371{
372    short bv = 0;
373    _GetPropertyCase(PROPCASE_BV, &bv, sizeof(bv));
374    return bv;
375}
376
377short shooting_get_canon_overexposure_value()
378{
379    short bv = 0;
380    _GetPropertyCase(PROPCASE_OVEREXPOSURE, &bv, sizeof(bv));
381    return bv;
382}
383
384
385short shooting_get_flash_mode()
386{
387    short fm = 0;
388    _GetPropertyCase(PROPCASE_FLASH_MODE, &fm, sizeof(fm));
389    return fm;
390}
391
392int shooting_get_luminance()// http://en.wikipedia.org/wiki/APEX_system
393{
394    short bv = shooting_get_bv96();
395    int b=(int)(100*k*pow(2.0,((double)(bv-168)/96.0)));
396    return b;
397}
398
399/*void shooting_set_iso_market(int isom)
400{
401        if (isom>0) {
402   shooting_set_sv96(shooting_get_sv96_from_iso((int)(((double)isom*(double)shooting_get_iso_base())/(double)shooting_get_iso_market_base())));
403  }
404}*/
405
406int shooting_get_exif_subject_dist()
407{
408    int sd = 0;
409    _GetPropertyCase(PROPCASE_SUBJECT_DIST1, &sd, sizeof(sd));
410    return sd;
411}
412
413int shooting_get_lens_to_focal_plane_width()
414{
415        return (int)(lens_get_focus_pos()-lens_get_focus_pos_from_lense());
416}
417
418int shooting_get_hyperfocal_distance_()
419{
420  int av=shooting_get_real_aperture();
421  int fl=get_focal_length(lens_get_zoom_point());       
422  if ((av>0) && (fl>0)) return (fl*fl)/(10*circle_of_confusion*av);
423  else return (-1);
424}
425
426int shooting_get_hyperfocal_distance()
427{
428 int h=shooting_get_hyperfocal_distance_();
429 if ((h>0) && (conf.dof_dist_from_lens))
430   return (h-shooting_get_lens_to_focal_plane_width());
431 else return h;
432}
433
434int shooting_get_hyperfocal_distance_f(int av, int fl)
435{
436  if ((av>0) && (fl>0) && (circle_of_confusion>0)) return (fl*fl)/(10*circle_of_confusion*av);
437  else return (-1);
438}
439
440int shooting_get_canon_subject_distance()
441{
442        if (conf.dof_use_exif_subj_dist) return shooting_get_exif_subject_dist();
443        else return lens_get_focus_pos();
444}
445
446int shooting_get_subject_distance_()
447{
448   if (!conf.dof_subj_dist_as_near_limit) return shooting_get_canon_subject_distance();
449   else {
450        int h, v, m;
451                int fl=get_focal_length(lens_get_zoom_point());
452        int near=shooting_get_canon_subject_distance();
453        int v1=(fl*fl);
454        int av_min=shooting_get_min_real_aperture();
455        int c_of_c=circle_of_confusion*10;
456        if ((av_min!=0) && (c_of_c!=0) && (v1)) {
457                    h=v1/(c_of_c*av_min);
458            if ((near>0) && (near<MAX_DIST)) {
459                  v=(h-near);
460                  m=h*near;
461                  if ((v>0) && (m>0)) return m/v; 
462             }
463        }
464        return (-1);
465    }
466}
467
468int shooting_get_subject_distance()
469{
470 int h=shooting_get_subject_distance_();
471 if ((h>0) && (conf.dof_dist_from_lens))
472   return (h-shooting_get_lens_to_focal_plane_width());
473 else return h;
474}
475
476int shooting_get_near_limit_of_acceptable_sharpness_()
477{
478        int s=shooting_get_canon_subject_distance();   
479        if (conf.dof_subj_dist_as_near_limit) return s;
480    else {
481      int h = shooting_get_hyperfocal_distance_();     
482      int m = h*s;
483      int v = h+s;
484      if ((m>0) && (v>0)) return (m/v);
485      else return (-1);
486    }
487}
488
489int shooting_get_near_limit_of_acceptable_sharpness()
490{
491 int h=shooting_get_near_limit_of_acceptable_sharpness_();
492 if ((h>0) && (conf.dof_dist_from_lens))
493   return (h-shooting_get_lens_to_focal_plane_width());
494 else return h;
495}
496
497int shooting_get_near_limit_f(int s, int a, int fl)
498{
499      int h = shooting_get_hyperfocal_distance_f(a, fl);       
500      int m = h*s;
501      int v = h+s;
502      if ((m>0) && (v>0)) return (m/v);
503      else return (-1);
504}
505
506int shooting_get_far_limit_of_acceptable_sharpness_()
507{
508        int s=shooting_get_subject_distance_(), h=shooting_get_hyperfocal_distance_(); 
509    int v = h-s;
510    int m = h*s;
511    if ((m>0) && (v>0)) return (m/v);
512    else return (-1);
513}
514
515int shooting_get_far_limit_of_acceptable_sharpness()
516{
517 int h=shooting_get_far_limit_of_acceptable_sharpness_();
518 if ((h>0) && (conf.dof_dist_from_lens))
519   return (h-shooting_get_lens_to_focal_plane_width());
520 else return h;
521}
522
523int shooting_get_depth_of_field()
524{
525  int far=shooting_get_far_limit_of_acceptable_sharpness_(), near=shooting_get_near_limit_of_acceptable_sharpness_();
526  if ((far>0) && (near>0)) return far-near;
527  else return (-1);
528}
529
530short shooting_get_tv96_from_shutter_speed(float t)
531{
532  if (t>0) return (short) (96.0*log(1.0/t)/log_2); 
533  else return (-10000);
534}
535
536float shooting_get_shutter_speed_from_tv96(short tv)
537{
538  return  pow(2,(float)((-1)*tv)/96.0 ); 
539}
540
541short shooting_get_tv96()
542{
543    short tv96;
544    _GetPropertyCase(PROPCASE_TV, &tv96, sizeof(tv96));
545    return tv96;
546}
547
548short shooting_get_user_tv96()
549{
550#if CAM_HAS_USER_TV_MODES
551    short tv;
552    _GetPropertyCase(PROPCASE_USER_TV, &tv, sizeof(tv));
553    return tv;
554#else       
555    return 0;
556#endif   
557}
558
559void shooting_set_user_tv96(short v)
560{
561#if CAM_HAS_USER_TV_MODES
562if ((mode_get()&MODE_MASK) != MODE_PLAY){
563long i;
564//    if ((v<SSID_MIN) || (v>SSID_MAX))
565//      return;
566 for (i=0;i<SS_SIZE;i++){
567        if (shutter_speeds_table[i].prop_id == v){
568                _SetPropertyCase(PROPCASE_USER_TV, &v, sizeof(v));
569                //_SetPropertyCase(PROPCASE_TV, &v, sizeof(v));
570            return;
571          }
572  }
573}
574#endif 
575}
576
577void shooting_set_tv96(short v, short is_now)
578{
579 long i;
580//    if ((v<SSID_MIN) || (v>SSID_MAX))
581//      return;
582if ((mode_get()&MODE_MASK) != MODE_PLAY){
583 for (i=0;i<SS_SIZE;i++){
584        if (shutter_speeds_table[i].prop_id == v){
585       shooting_set_tv96_direct(v, is_now);
586       return;
587     }
588  }
589}
590}
591
592void shooting_set_tv96_direct(short v, short is_now)
593{
594if ((mode_get()&MODE_MASK) != MODE_PLAY){
595        if(is_now) {
596           _SetPropertyCase(PROPCASE_TV, &v, sizeof(v));
597        }
598        else photo_param_put_off.tv96=v;
599}
600}
601
602
603void shooting_set_shutter_speed(float t, short is_now)
604{
605        if (t>0) shooting_set_tv96_direct((short) 96.0*log(1/t)/log_2, is_now); 
606}
607
608void shooting_set_shutter_speed_ubasic(int t, short is_now)
609{
610if ((mode_get()&MODE_MASK) != MODE_PLAY){
611        if (t>0) shooting_set_tv96_direct((short) (96.0*log(100000.0/(double)t)/log_2), is_now); 
612}
613}
614
615short shooting_get_av96()
616{
617    short av;
618    _GetPropertyCase(PROPCASE_AV, &av, sizeof(av));
619    return av;
620}
621
622short shooting_get_aperture_sizes_table_size()
623{
624    return AS_SIZE;
625}
626
627
628short shooting_get_aperture_sizes_table_prop_id(short i)
629{
630    return aperture_sizes_table[i].prop_id;
631}
632
633short shooting_get_max_aperture_sizes_table_prop_id()
634{
635    return AV96_MAX;
636}
637
638
639
640short shooting_get_av_prop_id()
641{
642    short av;
643    _GetPropertyCase(PROPCASE_AV, &av, sizeof(av));
644    return av;
645}
646
647
648
649short shooting_get_user_av96()
650{
651#if CAM_HAS_IRIS_DIAPHRAGM
652    short av;
653    _GetPropertyCase(PROPCASE_USER_AV, &av, sizeof(av));
654    return av;
655#else     
656    return 0;
657#endif
658}
659
660
661void shooting_set_av96(short v, short is_now)
662{
663#if CAM_HAS_IRIS_DIAPHRAGM     
664if ((mode_get()&MODE_MASK) != MODE_PLAY){
665 long i;
666//    if ((v<ASID_MIN) || (v>ASID_MAX))
667//      return;
668 for (i=0;i<AS_SIZE;i++){
669        if (aperture_sizes_table[i].prop_id == v){
670           shooting_set_av96_direct(v, is_now);
671           return;
672        }
673  }
674}
675#endif 
676}
677
678void shooting_set_nd_filter_state(short v, short is_now)
679{
680#if CAM_HAS_ND_FILTER
681if ((mode_get()&MODE_MASK) != MODE_PLAY){
682        if (is_now) {
683         if (v==1) _PutInNdFilter();
684         else if (v==2) _PutOutNdFilter();
685        }
686        else photo_param_put_off.nd_filter=v;
687}
688#endif 
689}
690
691
692
693void shooting_set_av96_direct(short v, short is_now)
694
695#if CAM_HAS_IRIS_DIAPHRAGM
696if ((mode_get()&MODE_MASK) != MODE_PLAY){
697 if(is_now) {
698   _SetPropertyCase(PROPCASE_AV, &v, sizeof(v));
699 }
700 else photo_param_put_off.av96=v;
701}
702#endif
703}
704
705
706void shooting_set_user_av96(short v)
707{
708#if CAM_HAS_IRIS_DIAPHRAGM
709    long i;
710if ((mode_get()&MODE_MASK) != MODE_PLAY){
711//    if ((v<ASID_MIN) || (v>ASID_MAX))
712//      return;
713
714 for (i=0;i<AS_SIZE;i++){
715        if (aperture_sizes_table[i].prop_id == v){
716                  _SetPropertyCase(PROPCASE_USER_AV, &v, sizeof(v));
717                  //_SetPropertyCase(PROPCASE_AV, &v, sizeof(v));
718            return;
719        }
720 }
721}
722#endif             
723}
724
725short shooting_get_drive_mode()
726{
727    short m;
728// reyalp - this is related to http://chdk.setepontos.com/index.php/topic,3994.405.html
729// TODO
730#if defined (CAMERA_sx200is)
731   short n;
732   // unlike other cameras, sx200 does set PROPCASE_DRIVE_MODE when in custom timer mode
733   // SX 200 IS 0,1,2,3,4=Off, 2 Second, Custom, Face Detection
734   _GetPropertyCase(PROPCASE_TIMER_MODE, &n, sizeof(n));
735   // note we return this only in custom mode.
736   // Other cameras would return 3 if any timer mode is set (?) even if it doesn't do multiple exposures
737   // note that face detect does multiple exposure
738   if(n==3){
739      return n;
740   }
741#endif
742
743    _GetPropertyCase(PROPCASE_DRIVE_MODE, &m, sizeof(m));
744    return m;
745}
746
747short shooting_can_focus()
748{
749#if !CAM_CAN_SD_OVER_NOT_IN_MF && CAM_CAN_SD_OVERRIDE
750 int m=mode_get()&MODE_SHOOTING_MASK;
751 int mode_video=((m==MODE_VIDEO_STD) ||
752                            (m==MODE_VIDEO_SPEED) || 
753                            (m==MODE_VIDEO_COMPACT) ||
754                            (m==MODE_VIDEO_MY_COLORS) ||
755                            (m==MODE_VIDEO_TIME_LAPSE) ||
756                            (m==MODE_VIDEO_COLOR_ACCENT));
757  return (shooting_get_focus_mode() || mode_video);
758#elif !CAM_CAN_SD_OVERRIDE
759 int m=mode_get()&MODE_SHOOTING_MASK;
760 int mode_video=((m==MODE_VIDEO_STD) ||
761                            (m==MODE_VIDEO_SPEED) || 
762                            (m==MODE_VIDEO_COMPACT) ||
763                            (m==MODE_VIDEO_MY_COLORS) ||
764                (m==MODE_VIDEO_TIME_LAPSE) ||
765                            (m==MODE_VIDEO_COLOR_ACCENT));
766  return mode_video;
767#elif defined (CAMERA_ixus800_sd700)                                               
768 int m=mode_get()&MODE_SHOOTING_MASK;
769  return (shooting_get_zoom()<8) && (m!=MODE_AUTO) && (m!=MODE_SCN_WATER);
770#else
771  return 1; 
772#endif                   
773}
774
775short shooting_get_common_focus_mode()
776{
777#if !CAM_HAS_MANUAL_FOCUS && CAM_CAN_SD_OVERRIDE
778  return shooting_get_subject_distance_override_koef();
779#elif !CAM_CAN_SD_OVERRIDE
780  return 0;
781#else
782  return shooting_get_focus_mode();
783#endif                   
784}
785
786short shooting_get_focus_mode()
787{
788  short m;
789  _GetPropertyCase(PROPCASE_FOCUS_MODE, &m, sizeof(m));
790  return m;
791}
792
793
794/*
795short shooting_get_continuous_mode_shoot_count()
796{
797    short c;
798    _GetPropertyCase(PROPCASE_CONT_MODE_SHOOT_COUNT, &c, sizeof(c));
799    return c;
800}
801*/
802
803
804void shooting_set_user_av_by_id(int v)
805{
806#if CAM_HAS_IRIS_DIAPHRAGM
807long i;
808if ((mode_get()&MODE_MASK) != MODE_PLAY){
809//    if ((v<ASID_MIN) || (v>ASID_MAX))
810//      return;
811  for (i=0;i<AS_SIZE;i++){
812                if (aperture_sizes_table[i].id == v){
813            short vv = aperture_sizes_table[i].prop_id;
814            _SetPropertyCase(PROPCASE_USER_AV, &vv, sizeof(vv));
815            //_SetPropertyCase(PROPCASE_AV, &vv, sizeof(vv));
816            return;
817                }
818  }
819}
820#endif       
821}
822
823void shooting_set_user_av_by_id_rel(int v)
824{
825#if CAM_HAS_IRIS_DIAPHRAGM
826if ((mode_get()&MODE_MASK) != MODE_PLAY){
827    int cv = shooting_get_user_av_id();
828    shooting_set_user_av_by_id(cv+v);
829}
830#endif   
831}
832
833
834int shooting_get_day_seconds()
835{
836    unsigned long t;
837    struct tm *ttm;
838    t = time(NULL);
839    ttm = localtime(&t);
840    return ttm->tm_hour * 3600 + ttm->tm_min * 60 + ttm->tm_sec;
841}
842
843int shooting_get_tick_count()
844{
845    return (int)get_tick_count();
846}
847
848void shooting_set_iso_mode(int v)
849{
850 long i;
851 for (i=0;i<ISO_SIZE;i++){
852        if (iso_table[i].id == v){
853            short vv = iso_table[i].prop_id;
854            _SetPropertyCase(PROPCASE_ISO_MODE, &vv, sizeof(vv));
855            return;
856        }
857  }
858}
859
860int shooting_in_progress()
861{
862    int t = 0;
863    _GetPropertyCase(PROPCASE_SHOOTING, &t, sizeof(&t));
864    return t != 0;
865}
866
867int shooting_is_flash()
868{
869 int t = 0;     
870 _GetPropertyCase(PROPCASE_IS_FLASH_READY, &t,sizeof(&t));
871 return t;
872}
873
874int shooting_is_flash_ready()
875{
876   int t = 0;
877/* well, I'm not sure what's exactly is happening here
878 * but it works for a610-100e
879 */
880   // _GetPropertyCase(204, &t, 4);
881   // if (t == 3){
882   _GetPropertyCase(PROPCASE_FLASH_MODE, &t, sizeof(&t));
883   if ((t != 2) && (shooting_in_progress()))
884     if (shooting_is_flash()) return _IsStrobeChargeCompleted();
885   return 1;
886}
887
888long get_file_counter()
889{
890#ifndef PARAM_FILE_COUNTER
891#       error Please define PARAM_FILE_COUNTER in platform`s shooting.c!
892#endif
893    long v = 0;
894    get_parameter_data(PARAM_FILE_COUNTER, &v, 4);
895    return v;
896}
897
898long get_exposure_counter()
899{
900#if defined(USE_FILE_COUNTER_FOR_EXP_COUNTING) || !defined(PARAM_EXPOSURE_COUNTER)
901    long v = 0;
902    get_parameter_data(PARAM_FILE_COUNTER, &v, 4);
903    v = ((v>>4)&0x3FFF);
904    return v;
905#else
906    long v = 0;
907    get_parameter_data(PARAM_EXPOSURE_COUNTER, &v, 4);
908    return v;
909#endif
910}
911
912short shooting_get_ev_correction1()
913{
914    short evc1 = 0;
915    _GetPropertyCase(PROPCASE_EV_CORRECTION_1, &evc1, sizeof(evc1));
916    return evc1;
917}
918
919#if CAM_QUALITY_OVERRIDE
920void shooting_set_image_quality(int imq)
921{
922  if (imq != 3){
923    _SetPropertyCase(PROPCASE_QUALITY, &imq, sizeof(imq));
924  }
925}
926#endif
927
928int shooting_get_zoom() {
929    return lens_get_zoom_point();
930}
931
932void shooting_set_zoom(int v) {
933    int dist;
934if ((mode_get()&MODE_MASK) != MODE_PLAY)
935        {
936    dist = shooting_get_focus();
937    lens_set_zoom_point(v);
938    shooting_set_focus(dist, SET_NOW);
939  }
940}
941
942void shooting_set_zoom_rel(int v) {
943    int cv = shooting_get_zoom();
944if ((mode_get()&MODE_MASK) != MODE_PLAY){
945    shooting_set_zoom(cv+v);
946}
947}
948
949void shooting_set_zoom_speed(int v) {
950if ((mode_get()&MODE_MASK) != MODE_PLAY){
951    lens_set_zoom_speed(v);
952}
953}
954
955int shooting_get_focus() {
956        return shooting_get_subject_distance();
957}
958
959void shooting_set_focus(int v, short is_now) {
960        int s=v;
961if ((mode_get()&MODE_MASK) != MODE_PLAY){
962        if ((is_now) && shooting_can_focus()) {
963          if (conf.dof_dist_from_lens) s+=shooting_get_lens_to_focal_plane_width();
964          if ((!conf.dof_subj_dist_as_near_limit) && (s>0)) lens_set_focus_pos((s<MAX_DIST)?s:MAX_DIST);
965          else {
966        int near=shooting_get_near_limit_f(s,shooting_get_min_real_aperture(),get_focal_length(lens_get_zoom_point()));
967        if (near>0) lens_set_focus_pos((near<MAX_DIST)?near:MAX_DIST);
968          }
969        }
970        else photo_param_put_off.subj_dist=v;
971}
972}
973
974void shooting_set_autoiso(int iso_mode) {
975        short max_iso;
976        switch (iso_mode) {
977                case -1: // ISO HI
978                        max_iso = conf.autoiso_max_iso_hi*10;
979                        break;
980                case 0: // ISO AUTO
981                        max_iso = conf.autoiso_max_iso_auto*10;
982                        break;
983                default:
984                        return;
985        }
986        int m=mode_get()&MODE_SHOOTING_MASK;
987        if (m==MODE_M || m==MODE_TV || m==MODE_STITCH) return; //Only operate outside of M and Tv
988        static const short shutter[]={0, 8, 15, 30, 60, 125, 250, 500, 1000};
989        float current_shutter = shooting_get_shutter_speed_from_tv96(shooting_get_tv96());
990       
991        short current_iso=shooting_get_iso_real();
992               
993        short min_shutter = shutter[conf.autoiso_shutter];
994        if (min_shutter == 0)
995                {
996                        short IS_factor = (shooting_get_is_mode()<=1)?conf.autoiso_is_factor:1;
997                        min_shutter = get_focal_length(lens_get_zoom_point())*conf.autoiso_user_factor / (IS_factor*1000);
998                //min_shutter is NOT 1/Xs but optimized for the calculation.
999                }
1000
1001        short target_iso = current_iso * min_shutter * current_shutter;
1002        short min_iso = conf.autoiso_min_iso*10;
1003       
1004        if (target_iso > max_iso)
1005                { target_iso = max_iso; }
1006        else if (target_iso < min_iso)
1007                { target_iso = min_iso; }
1008       
1009        float target_shutter = current_shutter *  current_iso / target_iso;
1010       
1011        shooting_set_shutter_speed(target_shutter, SET_NOW);
1012       
1013    shooting_set_iso_real(target_iso, SET_NOW);
1014       
1015}
1016
1017void shooting_video_bitrate_change(int v){
1018 int m[]={1,2,3,4,5,6,7,8,10,12};  // m[v]/4 = bitrate*1x
1019 if (v>=(sizeof(m)/sizeof(m[0]))) v=(sizeof(m)/sizeof(m[0]))-1;
1020#if CAM_CHDK_HAS_EXT_VIDEO_MENU
1021 change_video_tables(m[v],4);
1022#endif
1023}
1024
1025float shooting_get_shutter_speed_override_value()
1026{
1027  return (float)conf.tv_override_value*shutter_koef[conf.tv_override_koef]; 
1028}
1029
1030const char * shooting_get_tv_bracket_value()
1031{
1032  return expo_shift[conf.tv_bracket_value];
1033}
1034
1035const char * shooting_get_tv_override_value()
1036{
1037  return tv_override[conf.tv_override_value];
1038}
1039
1040
1041const char * shooting_get_bracket_type()
1042{
1043  return expo_type[conf.bracket_type]; 
1044}
1045
1046
1047short shooting_get_iso_override_value()
1048{
1049  return conf.iso_override_value*koef[conf.iso_override_koef]; 
1050}
1051
1052short shooting_get_iso_bracket_value()
1053{
1054  return conf.iso_bracket_value*koef[conf.iso_bracket_koef]; 
1055}
1056
1057
1058
1059short shooting_get_av96_override_value()
1060{
1061  if (conf.av_override_value<=AS_SIZE)  return (short) aperture_sizes_table[conf.av_override_value-1].prop_id;
1062  else return (short) (AV96_MAX+32*(conf.av_override_value-AS_SIZE));
1063}
1064
1065const char * shooting_get_av_bracket_value()
1066{
1067  return expo_shift[conf.av_bracket_value]; 
1068}
1069
1070
1071int shooting_get_subject_distance_override_value()
1072{
1073  return conf.subj_dist_override_value;
1074}
1075
1076int shooting_get_subject_distance_bracket_value()
1077{
1078  return conf.subj_dist_bracket_value*koef[conf.subj_dist_bracket_koef];
1079}
1080
1081int shooting_get_subject_distance_override_koef()
1082{
1083  static const short koef[] = {0, 1,10,100,1000};
1084  return koef[(conf.subj_dist_override_koef)];
1085
1086}
1087
1088void shooting_tv_bracketing(){
1089  short value, is_odd;
1090  int m=mode_get()&MODE_SHOOTING_MASK;
1091  if (bracketing.shoot_counter==0) { // first shoot
1092    bracketing.shoot_counter=1;
1093    // if Tv override is enabled... (this was adapted from function shooting_expo_param_override() )
1094    if ( ((conf.tv_enum_type) || (conf.tv_override_value)) && (conf.tv_override_koef) && !(conf.override_disable==1) ) {
1095      // ...use Tv override value as seed for bracketing:
1096      if (conf.tv_enum_type)
1097        bracketing.tv96 = 32*(conf.tv_override_value-18);
1098      else
1099        bracketing.tv96 = shooting_get_tv96_from_shutter_speed(shooting_get_shutter_speed_override_value());
1100    }
1101    // Tv override is disabled, use camera's opinion of Tv for bracketing seed value.
1102    else {
1103      #if defined (CAMERA_tx1) // M mode is actually automatic on the tx1.
1104      bracketing.tv96=shooting_get_tv96();
1105      #else
1106      if (!(m==MODE_M || m==MODE_TV)) bracketing.tv96=shooting_get_tv96();
1107      else bracketing.tv96=shooting_get_user_tv96();
1108      #endif
1109    }
1110    bracketing.tv96_step=32*conf.tv_bracket_value;
1111  }
1112  // other shoots
1113   bracketing.shoot_counter++;   
1114   is_odd=(bracketing.shoot_counter&1);
1115   if ((!is_odd) || (conf.bracket_type>0)) bracketing.dtv96+=bracketing.tv96_step;
1116   if (((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1))  value=bracketing.tv96-bracketing.dtv96;
1117   else value=bracketing.tv96+bracketing.dtv96;
1118   shooting_set_tv96_direct(value, SET_NOW);
1119}
1120
1121void shooting_av_bracketing(){
1122 short value, is_odd;
1123 int m=mode_get()&MODE_SHOOTING_MASK;
1124 if (bracketing.shoot_counter==0) { // first shoot
1125    bracketing.shoot_counter=1;
1126    //short av_override_value=shooting_get_av96_override_value;
1127    //if (av_override_value) bracketing.av96=av_override_value;
1128    if (!(m==MODE_M || m==MODE_AV)) bracketing.av96=shooting_get_av96();
1129        else bracketing.av96=shooting_get_user_av96();
1130    bracketing.av96_step=32*conf.av_bracket_value;
1131  }
1132  // other shoots
1133   bracketing.shoot_counter++;   
1134   is_odd=(bracketing.shoot_counter&1);
1135   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && ((bracketing.av96-bracketing.dav96)<AV96_MIN)))
1136       bracketing.dav96+=bracketing.av96_step;
1137   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && ((bracketing.av96-bracketing.dav96)>=AV96_MIN))
1138     {
1139     value=bracketing.av96-bracketing.dav96;
1140     shooting_set_av96_direct(value, SET_NOW);
1141     }
1142   else if (((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)  || (((!is_odd) && (conf.bracket_type==0)) && ((bracketing.av96-bracketing.dav96)<AV96_MIN)))
1143     {
1144     value=bracketing.av96+bracketing.dav96;
1145     shooting_set_av96_direct(value, SET_NOW);
1146     }
1147}
1148
1149
1150void shooting_iso_bracketing(){
1151 short value=0, is_odd;
1152 if (bracketing.shoot_counter==0) { // first shoot
1153    bracketing.shoot_counter=1;
1154    bracketing.iso=shooting_get_iso_real();
1155    bracketing.iso_step=shooting_get_iso_bracket_value();
1156    }
1157  // other shoots
1158   bracketing.shoot_counter++;   
1159   is_odd=(bracketing.shoot_counter&1);
1160   
1161   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && (bracketing.iso<=bracketing.diso)))
1162    {
1163           bracketing.diso+=bracketing.iso_step;
1164    }
1165   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && (bracketing.iso>bracketing.diso))
1166     {
1167     value=bracketing.iso-bracketing.diso;
1168     shooting_set_iso_real(value, SET_NOW);
1169     }
1170   else if ((((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)) || (((!is_odd) && (conf.bracket_type==0)) && (bracketing.iso<=bracketing.diso)))
1171     {
1172     value=bracketing.iso+bracketing.diso;
1173     shooting_set_iso_real(value, SET_NOW);
1174     }
1175}
1176
1177void shooting_subject_distance_bracketing(){
1178 short value=0, is_odd;
1179 if (bracketing.shoot_counter==0) { // first shoot
1180    bracketing.shoot_counter=1;
1181    bracketing.subj_dist=shooting_get_focus();
1182    bracketing.subj_dist_step=shooting_get_subject_distance_bracket_value();
1183 }
1184  // other shoots
1185   bracketing.shoot_counter++;   
1186   is_odd=(bracketing.shoot_counter&1);
1187   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && (bracketing.subj_dist<=bracketing.dsubj_dist)))
1188   {
1189           bracketing.dsubj_dist+=bracketing.subj_dist_step;
1190   }
1191   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && (bracketing.subj_dist>bracketing.dsubj_dist))
1192     {
1193     value=bracketing.subj_dist-bracketing.dsubj_dist;
1194     shooting_set_focus(value, SET_NOW);
1195     }
1196   else if ((((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)) || (((!is_odd) && (conf.bracket_type==0)) && (bracketing.subj_dist<=bracketing.dsubj_dist)))
1197     {
1198     value=bracketing.subj_dist+bracketing.dsubj_dist;
1199     shooting_set_focus(value, SET_NOW);
1200    }
1201}
1202
1203
1204void shooting_bracketing(void){
1205 
1206  short drive_mode=shooting_get_drive_mode();
1207  if (shooting_get_drive_mode()!=0)  {
1208     int m=mode_get()&MODE_SHOOTING_MASK;
1209     if (m!=MODE_STITCH) {
1210       if (state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) {
1211           bracketing.shoot_counter=0;
1212           bracketing.av96=0;
1213           bracketing.dav96=0;
1214           bracketing.tv96=0;
1215           bracketing.dtv96=0;
1216           bracketing.sv96=0;
1217           bracketing.dsv96=0;
1218           bracketing.iso=0;
1219           bracketing.diso=0;
1220           bracketing.subj_dist=0;
1221           bracketing.dsubj_dist=0;
1222           bracketing.type=0;
1223       }
1224           if (conf.tv_bracket_value && !(conf.override_disable==1 && conf.override_disable_all))  shooting_tv_bracketing();
1225              else if (conf.av_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) shooting_av_bracketing();
1226              else if ((conf.iso_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) && (conf.iso_bracket_koef)) {
1227                          shooting_iso_bracketing();
1228               }
1229              else if ((conf.subj_dist_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) && (conf.subj_dist_bracket_koef)) shooting_subject_distance_bracketing();           else if ((conf.subj_dist_bracket_value) && (conf.subj_dist_bracket_koef)) shooting_subject_distance_bracketing();
1230      }
1231   }
1232}
1233
1234#if CAM_REAR_CURTAIN
1235  void shooting_set_flash_sync_curtain(int curtain){
1236   _SetPropertyCase(PROPCASE_FLASH_SYNC_CURTAIN, &curtain, sizeof(curtain));
1237  }
1238#endif
1239
1240// forces manual flash. if set, flash will ALWAYS be triggered (manual)
1241        void shooting_set_flash_video_override(int flash, int power){
1242                int mode = 1;
1243                if ((conf.flash_manual_override && conf.flash_video_override && (movie_status > 1)) || (conf.flash_manual_override && !conf.flash_video_override)) {
1244                                                _SetPropertyCase(PROPCASE_FLASH_ADJUST_MODE, &mode, sizeof(mode));
1245                                                _SetPropertyCase(PROPCASE_FLASH_FIRE, &flash, sizeof(flash));
1246                                                _SetPropertyCase(PROPCASE_FLASH_MANUAL_OUTPUT, &power, sizeof(power));
1247                                        }
1248  }
1249
1250// TODO sd990 hack for overrides
1251// caller must save regs
1252int captseq_hack_override_active() {
1253 if (state_kbd_script_run)
1254        if ( photo_param_put_off.tv96 || photo_param_put_off.sv96 )
1255                return 1;
1256 if(conf.override_disable==1)
1257        return 0;
1258 if(conf.iso_override_value && conf.iso_override_koef)
1259        return 1;
1260 if((conf.tv_enum_type || conf.tv_override_value) && conf.tv_override_koef)
1261        return 1;
1262 return 0;
1263}
1264
1265void __attribute__((naked,noinline)) shooting_expo_param_override(void){
1266 asm volatile("STMFD   SP!, {R0-R12,LR}\n");
1267
1268 //if (conf.tv_override) shooting_set_tv96_direct(-384-32*conf.tv_override);
1269 //short drive_mode=shooting_get_drive_mode();
1270/*if(drive_mode!=last_drive_mode)
1271 {
1272  if (last_drive_mode==0) shoot_counter=0;
1273  last_drive_mode=drive_mode;
1274 }*/
1275 //int m=mode_get()&MODE_SHOOTING_MASK;
1276 if ((state_kbd_script_run) && (photo_param_put_off.tv96)) {
1277  shooting_set_tv96_direct(photo_param_put_off.tv96, SET_NOW); 
1278  photo_param_put_off.tv96=0;
1279 }
1280   else if (((conf.tv_enum_type) || (conf.tv_override_value)) && (conf.tv_override_koef) && !(conf.override_disable==1))
1281   {
1282   if (conf.tv_enum_type)
1283//     shooting_set_tv96_direct(32*(conf.tv_override_value-18),SET_NOW);
1284     shooting_set_tv96_direct(32*(conf.tv_override_value-(tv_override_zero_shift)),SET_NOW);
1285   else   
1286    shooting_set_tv96_direct(shooting_get_tv96_from_shutter_speed(shooting_get_shutter_speed_override_value()), SET_NOW);
1287   }
1288 if ((state_kbd_script_run) && (photo_param_put_off.sv96)) {
1289  shooting_set_sv96(photo_param_put_off.sv96, SET_NOW);
1290  photo_param_put_off.sv96=0;
1291  }
1292else if ((conf.iso_override_value) && (conf.iso_override_koef) && !(conf.override_disable==1))
1293  shooting_set_iso_real(shooting_get_iso_override_value(), SET_NOW);
1294 else if (conf.autoiso_enable && shooting_get_flash_mode()/*NOT FOR FLASH AUTO MODE*/ && !(conf.override_disable==1 && conf.override_disable_all))
1295  shooting_set_autoiso(shooting_get_iso_mode());
1296 if ((state_kbd_script_run) && (photo_param_put_off.av96)) {
1297  shooting_set_av96_direct(photo_param_put_off.av96, SET_NOW);
1298  photo_param_put_off.av96=0;
1299  }
1300 else if (conf.av_override_value && !(conf.override_disable==1))
1301 shooting_set_av96_direct(shooting_get_av96_override_value(), SET_NOW);
1302 if ((state_kbd_script_run) && (photo_param_put_off.subj_dist)) {
1303  shooting_set_focus(photo_param_put_off.subj_dist, SET_NOW);
1304  photo_param_put_off.subj_dist=0; 
1305  }
1306  else if ((conf.subj_dist_override_value) && (conf.subj_dist_override_koef) && !(conf.override_disable==1))
1307   shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1308#if CAM_HAS_ND_FILTER
1309 if ((state_kbd_script_run) && (photo_param_put_off.nd_filter)) {
1310   shooting_set_nd_filter_state(photo_param_put_off.nd_filter, SET_NOW);
1311   photo_param_put_off.nd_filter=0; 
1312  }
1313 else if (conf.nd_filter_state && !(conf.override_disable==1))
1314   shooting_set_nd_filter_state(conf.nd_filter_state, SET_NOW);
1315#endif 
1316
1317#if CAM_REAR_CURTAIN
1318  shooting_set_flash_sync_curtain(conf.flash_sync_curtain);
1319#endif
1320
1321
1322  shooting_set_flash_video_override(conf.flash_manual_override,conf.flash_video_override_power);
1323#if CAM_QUALITY_OVERRIDE
1324 // this doesn't really need to be set in the override hook.
1325 // should only need to be set once if the users doesn't change back, but doing it here ensures it is set
1326 shooting_set_image_quality(conf.fast_image_quality);
1327#endif
1328 asm volatile("LDMFD   SP!, {R0-R12,PC}\n");
1329}
1330
1331void unlock_optical_zoom(void){
1332
1333#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
1334 if (conf.unlock_optical_zoom_for_video) _UnsetZoomForMovie();
1335#endif
1336
1337#if CAM_EV_IN_VIDEO
1338 set_ev_video_avail(0);
1339#endif
1340
1341}
1342
1343
1344#if CAM_EV_IN_VIDEO
1345
1346int ev_video_avail;
1347int ev_video;
1348int save_tv_video;
1349int tv_min_video;
1350
1351int get_ev_video_avail(void){
1352 return ev_video_avail;
1353}
1354
1355void set_ev_video_avail(int x){
1356 if (ev_video_avail==x) return;
1357 ev_video_avail=x;
1358 if (x) {
1359  ev_video=0;
1360  _ExpCtrlTool_StopContiAE(0,0);
1361  _GetPropertyCase(PROPCASE_TV,&save_tv_video,2);
1362  if ((mode_get()&MODE_SHOOTING_MASK)==MODE_VIDEO_SPEED) tv_min_video=577;  // 1/60
1363   else tv_min_video=480; //1/30
1364 }
1365 else _ExpCtrlTool_StartContiAE(0,0);
1366}
1367
1368int get_ev_video(void){
1369 return ev_video;
1370}
1371
1372void set_ev_video(int x){
1373 short ev, tv;
1374 if ((x<-4)||(x>4)) return;
1375 ev=48*x;
1376 tv=save_tv_video-ev;
1377 if (tv>=tv_min_video) {
1378  ev_video=x;
1379  _SetAE_ShutterSpeed(&tv);
1380 }
1381}
1382
1383#endif
Note: See TracBrowser for help on using the repository browser.