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

Revision 531, 33.4 KB checked in by phyrephox, 5 years ago (diff)
  • increased version number to reflect for latest changes from previous revisions

+ added zoom override. first installment allows you to set a specific zoom value (on s3is for example between 0 and 128, on a620 between 0 and 8) that will be set upon starting the cam in record mode. Extra Photo Operations -> Zoom Override. You can disable and enable it there (default: off), also you can set the startup behaviour (there isnt much working right now :D). In the future: Not only set the zoom steps (in accurate int) but maybe set it using mm & factor (much like the shutter override menu stuff to allow for easing setting using "mnemonics"). Also will implement ZOOM BRACKETING. could be done via script, but then again everything could be done via script ;) Also i am wondering if i should focus after zooming. Also the zoom override should work like this, that no matter what value of zoom you set using the zoom lever, before each pic is taken the zoom will be set to the value you specified in the menu (much like shutter & aperture override). Also maybe implement the feature so that it remembers the actual zoom value you set (via lever/button) before shutting off the cam - and restore it when you power it on again!?
This feature works a) as somehow a "C" (custom mode in which you can save a few settings that will be remembered even when you shut off the cam) mode for cameras that dont have it and b) for studio photogs or other situations where you need the zoom in a fixed value over a long period of time. Noticed a bug: when you use this feature to zet zoom upon startup, you cant zoom out using the zoomlever, unless you zoom out before - i guess it is because the camera thinks you are still in wide (zoom 0). i guess one can fix that, dunno how though (yet).

+ added czech language file

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