Etiquette, expectations, entitlement...
@autoexec_bin | #magiclantern | Discord | Reddit | Server issues
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts Menu
#define DOC(x,...)
struct menu_entry zebra_menus[] = {
{
.name = "Global Draw",
.priv = &global_draw,
.max = 3,
.select_Q = toggle_disp_mode_menu,
.display = global_draw_display,
.icon_type = IT_BOOL,
.help = "Enable/disable ML overlay graphics (zebra, cropmarks...)",
DOC(
Choose when to enable Magic Lantern overlay graphics: (zebra, cropmarks, histograms, audio meters, ML shooting info...):
* in **LiveView** only;
* in **QuickReview** (photo mode outside LiveView) only;
* **Both modes** (default);
* **Disabled**.
If you use `display presets`_, press Q on this item to switch the presets while you are in ML menu.
)
},
...
[Pass] strlen("abc") => 0x3
[Pass] strlen("qwertyuiop") => 0xa
[Pass] strlen("") => 0x0
[Pass] strcpy(msg, "hi there") => 0x1a7560
[Pass] msg => 'hi there'
[Pass] snprintf(a, sizeof(a), "foo") => 0x3
[Pass] snprintf(b, sizeof(b), "foo") => 0x3
[Pass] strcmp(a, b) => 0x0
[Pass] snprintf(a, sizeof(a), "bar") => 0x3
[Pass] snprintf(b, sizeof(b), "baz") => 0x3
[Pass] strcmp(a, b) => 0xfffffff8
[Pass] snprintf(a, sizeof(a), "Display") => 0x7
[Pass] snprintf(b, sizeof(b), "Defishing") => 0x9
[Pass] strcmp(a, b) => 0x4
[Pass] memcpy(foo, bar, 6) => 0xb9158
[Pass] foo => 'asdfghuiop'
[Pass] memset(bar, '*', 5) => 0xb9164
[Pass] bar => '*****hjkl;'
bzero32(bar + 5, 5)
[Pass] bar => '****'
t0 = *(uint32_t*)0xC0242014 => 0x7273b
msleep(250)
t1 = *(uint32_t*)0xC0242014 => 0xb14ca
[Pass] ABS(mod(t1-t0, 1048576)/1000 - 250) => 0x7
LoadCalendarFromRTC( &now )
s0 = now.tm_sec => 0x14
Date/time: 2012/10/29 23:44:20
msleep(1500)
LoadCalendarFromRTC( &now )
s1 = now.tm_sec => 0x16
[Pass] mod(s1-s0, 60) => 0x2
[Pass] mod(s1-s0, 60) => 0x2
m0 = MALLOC_FREE_MEMORY => 0x5bc28
p = malloc(50*1024) => 0xe3c00
m1 = MALLOC_FREE_MEMORY => 0x4f418
free(p)
m2 = MALLOC_FREE_MEMORY => 0x5bc28
[Pass] ABS((m0-m1) - 50*1024) => 0x10
[Pass] ABS(m0-m2) => 0x0
m0 = GetFreeMemForAllocateMemory() => 0x3eb0d4
p = AllocateMemory(256*1024) => 0x79f9d4
m1 = GetFreeMemForAllocateMemory() => 0x3ab0c8
FreeMemory(p)
m2 = GetFreeMemForAllocateMemory() => 0x3eb0d4
[Pass] ABS((m0-m1) - 256*1024) => 0xc
[Pass] ABS(m0-m2) => 0x0
m01 = MALLOC_FREE_MEMORY => 0x5bc28
m02 = GetFreeMemForAllocateMemory() => 0x3eb0d4
p = alloc_dma_memory(256*1024) => 0x4079fa14
free_dma_memory(p)
[Pass] UNCACHEABLE(p) => 0x4079fa14
[Pass] CACHEABLE(p) => 0x79fa14
[Pass] UNCACHEABLE(CACHEABLE(p)) => 0x4079fa14
p = (void*)shoot_malloc(24*1024*1024) => 0x5be60074
shoot_free(p)
m11 = MALLOC_FREE_MEMORY => 0x5bc28
m12 = GetFreeMemForAllocateMemory() => 0x3eb0d4
[Pass] ABS(m01-m11) => 0x0
[Pass] ABS(m02-m12) => 0x0
EngDrvOut(0xC0F14400, 0x1234)
[Pass] shamem_read(0xC0F14400) => 0x1234
call("TurnOffDisplay")
[Pass] DISPLAY_IS_ON => 0x0
call("TurnOnDisplay")
[Pass] DISPLAY_IS_ON => 0x1
SetGUIRequestMode(1); msleep(500);
[Pass] CURRENT_DIALOG_MAYBE => 0x1
SetGUIRequestMode(2); msleep(500);
[Pass] CURRENT_DIALOG_MAYBE => 0x2
SetGUIRequestMode(0); msleep(500);
[Pass] CURRENT_DIALOG_MAYBE => 0x0
GUI_Control(BGMT_PLAY, 0, 0, 0); msleep(500);
[Pass] PLAY_MODE => 0x1
[Pass] MENU_MODE => 0x0
GUI_Control(BGMT_MENU, 0, 0, 0); msleep(500);
[Pass] MENU_MODE => 0x1
[Pass] PLAY_MODE => 0x0
GUI_Control(BGMT_MENU, 0, 0, 0); msleep(500);
[Pass] MENU_MODE => 0x0
[Pass] PLAY_MODE => 0x0
task_create("test", 0x1c, 0x1000, test_task, 0) => 0x8c800c8
[Pass] test_task_created => 0x1
[Pass] get_task_name_from_id(get_current_task()) => 'run_test'
[Pass] mq = (void*)msg_queue_create("test", 5) => 0x8ca00a6
[Pass] msg_queue_post(mq, 0x1234567) => 0x0
[Pass] msg_queue_receive(mq, (struct event **) &m, 500) => 0x0
[Pass] m => 0x1234567
[Pass] msg_queue_receive(mq, (struct event **) &m, 500) => 0x9
[Pass] sem = create_named_semaphore("test", 1) => 0x8cc02e2
[Pass] take_semaphore(sem, 500) => 0x0
[Pass] take_semaphore(sem, 500) => 0x9
[Pass] give_semaphore(sem) => 0x0
[Pass] take_semaphore(sem, 500) => 0x0
[Pass] rlock = CreateRecursiveLock(0) => 0x8ce00c6
[Pass] AcquireRecursiveLock(rlock, 500) => 0x0
[Pass] AcquireRecursiveLock(rlock, 500) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0xf
[Pass] f = FIO_CreateFileEx(CARD_DRIVE"test.dat") => 0x4
[Pass] FIO_WriteFile(f, (void*)ROMBASEADDR, 0x10000) => 0x10000
[Pass] FIO_WriteFile(f, (void*)ROMBASEADDR, 0x10000) => 0x10000
FIO_CloseFile(f)
[Pass] FIO_GetFileSize(CARD_DRIVE"test.dat", &size) => 0x0
[Pass] size => 0x20000
[Pass] p = alloc_dma_memory(0x20000) => 0x4079fa14
[Pass] f = FIO_Open(CARD_DRIVE"test.dat", O_RDONLY | O_SYNC) => 0x4
[Pass] FIO_ReadFile(f, p, 0x20000) => 0x20000
FIO_CloseFile(f)
free_dma_memory(p)
[Pass] FIO_RemoveFile(CARD_DRIVE"test.dat") => 0x0
SW1(1,100)
[Pass] HALFSHUTTER_PRESSED => 0x1
SW1(0,100)
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] DLG_SIGNATURE => 0x6e4944
void
draw_404_page()
{
bmp_fill(COLOR_BLACK, 0, 0, 720, 480);
bfnt_puts("404 Undocumented Feature", 10, 20, COLOR_WHITE, COLOR_BLACK);
bmp_printf(FONT_MED, 10, 100, "This feature is probably not yet documented.");
bmp_printf(FONT_MED, 10, 120, "After all, we are programmers, not tech writers.");
bmp_printf(FONT_MED, 10, 180, "But... you can simply try it and see what it does.");
bmp_printf(FONT_MED, 10, 240, "Then, write a short paragraph to describe it,");
bmp_printf(FONT_MED, 10, 260, "and we will include it in the user guide.");
bmp_printf(FONT_MED, 10, 320, "Thanks!");
}
void
draw_help_not_installed_page()
{
bmp_fill(COLOR_BLACK, 0, 0, 720, 480);
bfnt_puts("Help files not found", 10, 20, COLOR_WHITE, COLOR_BLACK);
bmp_printf(FONT_MED, 10, 150, "Magic Lantern help files seem to have disappeared. Whoops!");
bmp_printf(FONT_MED, 10, 250, "To browse help, please copy the DOC directory on your card.");
bmp_printf(FONT_MED, 10, 350, "Or... just go out and take some pictures :)");
}
Quote
2.2 Copyright
The copyright in this website is owned by Trek or its licensors. No part or parts hereof may be reproduced, distributed, adapted, modified, republished, displayed, broadcast, hyperlinked, framed or retransmitted in any manner or by any means or stored in an information retrieval system without the prior written permission from Trek. However, you may download and print the Materials on this website for personal, non-commercial use only provided you do not modify the Materials and that you retain all copyright and other proprietary notices contained in the Materials. Without the permission from Trek, you may not insert a hyperlink to this website on any other website or reproduce any Material contained on this website on any other server.
Quote from: Original PostDownload ML for 5D Mark III - Alpha 3.
Usage:
1) Update camera firmware to 1.1.3.
2) Format the card from the camera.
3) Copy ML files on the card and run Firmware Update.
NOTES
THIS VERSION OF MAGICLANTERN HAS AUTOBOOT DISABLED
Which means you'll have to re-run the firmware update every time you power off the camera.
It's a safety measure: this version will not attempt to change any camera settings. Try it if you are not yet confortable with the nightly builds.
Risks:
- This is one of the safest versions as of right now, but its feature set is quite limited.
- Nothing is written into ROM, and no camera settings are changed by this version, so risks should be minimal.
- If anything goes wrong, we don't pay for repairs. Use Magic Lantern at your own risk!
Features:
- Card test at startup
- Histogram and waveform moved to bottom
- New experimental display for focus peaking (extreme sharpness)
- 16:9 bars for anamorphic preview
- Focus box moves faster (not yet customizable)
- After taking a picture and pressing Zoom In right away, you can scroll through pictures
- Saturation boost when adjusting white balance
- Warnings for bad settings (e.g. if you set picture quality to JPEG instead of RAW by mistake)
- Dim the red LED while recording (make it less distracting)
From alpha 2:
- Magic Zoom (zoom while recording), experimental focus peaking modes, ghost image, display presets
- Movie indicators, movie logging, rec/standby notification, force LiveView for manual lenses
- Gradual exposure in movie mode
- HDR video
- Brightness, contrast, saturation, display gain, color schemes, UniWB correction, upside-down mode
- Clean HDMI with pillarboxes
- Anamorphic and fisheye correction
- Image review tweaks (exposure adjust, remember zoom position...)
- Task and CPU usage info
From alpha 1:
- zebras, focus peaking, cropmarks, spotmeter, histogram, waveform, vectorscope, audio meters.
- card benchmark, debug info, stability tests.
Tips:
- Disable Auto Power Off.
- Recommended usage: copy ML on a small SD card, keep it in the camera, and use CF cards for shooting.
- You can use any card combination, just don't put ML on both cards.
- EyeFi cards are working!!! (thanks kikouyou)
Known issues:
- Some users reported a few random lock-ups with Alpha 1, but I could not reproduce any.
- The experimental focus peaking modes are a bit too slow (will slowdown LiveView frame rate).
FOR DEVELOPERS ONLY
Want to help with the porting proces? Use this special updater file to enable the bootflag and dump the firmware. With this, you can compile your own autoexec.bin and run it on your camera.
(BE AWARE: This file will set a boot flag which cannot be undone (yet). This will increase your camera boot time slightly and also increase the wake up time from 0.2 sec to 2 sec.) added by Renato 11-6-2013
You will be able to try the entire ML feature set, but the risks of permanent damage are a lot higher than with the public alphas. Use it at your own risk.
# RAW deflickering script
# Copyright (2012) a1ex. License: GPL.
from __future__ import division
import os, sys, re, time, datetime, subprocess, shlex
from math import *
from pylab import *
def progress(x, interval=1):
global _progress_first_time, _progress_last_time, _progress_message, _progress_interval
try:
p = float(x)
init = False
except:
init = True
if init:
_progress_message = x
_progress_last_time = time.time()
_progress_first_time = time.time()
_progress_interval = interval
elif x:
if time.time() - _progress_last_time > _progress_interval:
print >> sys.stderr, "%s [%d%% done, ETA %s]..." % (_progress_message, int(100*p), datetime.timedelta(seconds = round((1-p)/p*(time.time()-_progress_first_time))))
_progress_last_time = time.time()
def change_ext(file, newext):
if newext and (not newext.startswith(".")):
newext = "." + newext
return os.path.splitext(file)[0] + newext
def get_median(file):
cmd1 = "dcraw -c -D -4 -o 0 '%s'" % file
cmd2 = "convert - -type Grayscale -scale 500x500 -format %c histogram:info:-"
#~ print cmd1, "|", cmd2
p1 = subprocess.Popen(shlex.split(cmd1), stdout=subprocess.PIPE)
p2 = subprocess.Popen(shlex.split(cmd2), stdin=p1.stdout, stdout=subprocess.PIPE)
lines = p2.communicate()[0].split("\n")
X = []
for l in lines[1:]:
p1 = l.find("(")
if p1 > 0:
p2 = l.find(",", p1)
level = int(l[p1+1:p2])
count = int(l[:p1-2])
X += [level]*count
m = median(X)
return m
ion()
progress("Analyzing RAW exposures...");
files = sorted(os.listdir("raw"))
i = 0;
M = [];
for k,f in enumerate(files):
m = get_median(os.path.join('raw', f))
M.append(m);
E = [-log2(m/M[0]) for m in M]
E = detrend(array(E))
cla(); stem(range(1,len(E)+1), E);
xlabel('Image number')
ylabel('Exposure correction (EV)')
title(f)
draw();
progress(k / len(files))
progress("Developing JPG images...");
i = 0;
for k,f in enumerate(files):
ec = 2 + E[k];
cmd = "ufraw-batch --out-type=jpg --overwrite --clip=film --saturation=2 --exposure=%s '%s' --output='jpg/%s'" % (ec, os.path.join("raw", f), change_ext(f, ".jpg"))
os.system(cmd)
progress(k / len(files))
[/size]
FILE* f = FIO_CreateFileEx("A:/test.log");
for (int i = 0; i < 1000; i++)
FIO_WriteFile(f, "Will it blend?\n", 15);
FIO_CloseFile(f);
for (int i = 0; i < 1000; i++)
{
FILE* f = FIO_CreateFileEx("A:/test.log");
FIO_WriteFile(f, "Will it blend?\n", 15);
FIO_CloseFile(f);
}
cache_fake((uint32_t)&DryosDebugMsg, B_INSTR((uint32_t)&DryosDebugMsg, my_DebugMsg), TYPE_ICACHE);
(1) -- 17 scsReleaseOn -->(1)
(1) -- 1 scsReleaseStart -->(2)
(2) -- 2 scsReleaseData -->(4)
(4) -- 3 scsDummyCapEnd -->(5)
(5) -- 4 scsDummyReadoutDone -->(6)
(6) -- 5 scsCapReady -->(7)
(7) -- 6 scsCapEnd -->(8)
(8) -- 10 scsReleaseEnd -->(8)
(8) -- 18 scsReleaseOff -->(8)
(8) -- 7 scsFinalReadoutDone -->(1)
(1) -- 1 scsReleaseStart -->(2) // tg start, lock engine resources...
(2) -- 2 scsReleaseData -->(4) // lots of initializations, iso, tv, av, tp, po, register head1 interrupt to dummy cap...
(4) -- 3 scsDummyCapEnd -->(5) // some engio; register head1 interrupt to dummy readout done
(5) -- 4 scsDummyReadoutDone-->(6) // engio, decides between normal capture, srcapture or eshutcapture
(6) -- 5 scsCapReady -->(10) // setup image pass, engio, head1 interrupt to CapEnd, register vd interrupt
(10) -- 8 scsVdInterrupt -->(10)
(10) -- 8 scsVdInterrupt -->(10) // calls GetImageBuffer and seems to re-setup the sensor (also setting the FPS override registers)
.... // so maybe a long exposure is done by adding a few short ones?!
(10) -- 8 scsVdInterrupt -->(10)
(10) -- 11 scsBulbEnd -->(10) // scs_struct.bulb_end = 1 => this causes scsVdInterrupt to "stop accumulation" (whatever that means)
(10) -- 8 scsVdInterrupt -->(10) // stop accumulation => NotifyLastVdTimerCBR => post event 9 to something
(10) -- 10 scsReleaseEnd -->(10) // scs_struct.release_end = 1
(10) -- 9 scsCapReady -->(7)
(7) -- 6 scsCapEnd -->(8) // register head1 to readout done, RealtimeDefectsGrade -> 0xC0F0814C, post event 0xB to something else
(8) -- 7 scsFinalReadoutDone-->(1) // huge, probably does raw conversion, noise reduction...
FSS :(0) -- 7 fssSW1On -->(0)
SBS :(1) -- 13 sbsIgnoreRelease -->(1)
SCS :(1) -- 1 scsReleaseStart -->(2)
SCS :(2) -- 2 scsReleaseData -->(4)
SCS :(4) -- 3 scsDummyCapEnd -->(5)
FSS :(0) -- 8 fssSW2On -->(0)
SCS :(5) -- 4 scsDummyReadoutDone -->(6)
SCS :(6) -- 5 scsCapReady -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(10) -- 8 scsVdInterrupt -->(10)
SCS :(7) -- 10 scsReleaseEnd -->(7)
FSS :(0) -- 9 fssSW2Off -->(0)
SCS :(10) -- 9 scsCapReady -->(7)
SCS :(7) -- 6 scsCapEnd -->(8)
SCS :(8) -- 7 scsFinalReadoutDone -->(1)
SBS :(1) -- 1 sbsPostJob? -->(2)
SBS :(2) -- 2 sbsPrepareDark -->(3)
SBS :(3) -- 3 sbsDummyCapEnd -->(4)
SBS :(4) -- 4 sbsDummyReadoutDone -->(5)
SBS :(5) -- 5 sbsDark -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 6 sbsVdInterrupt -->(6)
SBS :(6) -- 7 sbsLongSecondTimer -->(7)
SBS :(7) -- 8 sbsCapEnd -->(8)
SBS :(8) -- 9 sbsReadoutDone -->(9)
SBS :(9) -- 10 sbsDarkSub -->(10)
SBS :(10) -- 11 sbsWbDetect -->(11)
SBS :(11) -- 12 sbsWbDetectDone -->(1)
SPS :(2) -- 2 spsPostJob -->(3)
SPS :(3) -- 3 spsStartProcess -->(3)
SDSf1:(2) -- 2 sdsPostJob -->(2)
SDSr :(2) -- 2 sdfGetDevelopDevType?->(5)
SPS :(3) -- 4 spsStartProcess_main-->(2)
SDSf3:(0) -- 3 sdsMem1toRAWcompressg-->(1)
SDSf3:(1) -- 3 sdsMem1toJpegDevelop-->(1)
SDSr :(5) -- 5 sdsYuvToDcfCompression>(5)
SDSr :(5) -- 5 -->(2)
FCS :(1) -- 1 fcsPostJob -->(1)
FCS :(1) -- 2 fcsExecJob -->(1)
FSS :(0) -- 2 fssNotifyJob -->(0)
FSS :(0) -- 3 fssPostJob -->(0)
FSS :(0) -- 4 fssAvailable -->(0)
FSS :(0) -- 6 fssCompleteJob -->(0)
FSS :(0) -- 7 fssSW1On -->(0)
/**
* Experiments on state objects
*
* http://magiclantern.wikia.com/wiki/StateObjects
*
**/
#include "dryos.h"
#include "bmp.h"
#include "state-object.h"
#include "property.h"
// 550D:
//~ #define SCS_STATE (*(struct state_object **)0x31cc)
//~ #define SCSES_STATE (*(struct state_object **)0x31D0)
//~ #define SCSSR_STATE (*(struct state_object **)0x31D4)
// 5D2:
#define SCS_STATE (*(struct state_object **)0x3168)
#define SCSES_STATE (*(struct state_object **)0x316c)
#define SCSSR_STATE (*(struct state_object **)0x3170)
#define SBS_STATE (*(struct state_object **)0x31C4)
#define SDS_REAR_STATE (*(struct state_object **)0x363C)
#define SDS_FRONT1_STATE (*(struct state_object **)0x36B0)
#define SDS_FRONT2_STATE (*(struct state_object **)0x36B4)
#define SDS_FRONT3_STATE (*(struct state_object **)0x36B8)
#define SDS_FRONT4_STATE (*(struct state_object **)0x36BC)
#define SPS_STATE (*(struct state_object **)0x320C)
#define FSS_STATE (*(struct state_object **)0x3c24)
#define FCS_STATE (*(struct state_object **)0x3c34)
#define LOG_SIZE 10000
static char log[LOG_SIZE] = "";
static int (*StateTransition)(void*,int,int,int,int) = 0;
static int stateobj_spy(struct state_object * self, int x, int input, int z, int t)
{
int old_state = self->current_state;
int ans = StateTransition(self, x, input, z, t);
int new_state = self->current_state;
if (self == SBS_STATE) { STR_APPEND(log, "SBS :"); }
else if (self == SCS_STATE) { STR_APPEND(log, "SCS :"); }
else if (self == SCSES_STATE) { STR_APPEND(log, "SCSes:"); }
else if (self == SCSSR_STATE) { STR_APPEND(log, "SCSsr:"); }
else if (self == SDS_REAR_STATE) { STR_APPEND(log, "SDSr :"); }
else if (self == SDS_FRONT1_STATE) { STR_APPEND(log, "SDSf1:"); }
else if (self == SDS_FRONT2_STATE) { STR_APPEND(log, "SDSf2:"); }
else if (self == SDS_FRONT3_STATE) { STR_APPEND(log, "SDSf3:"); }
else if (self == SDS_FRONT4_STATE) { STR_APPEND(log, "SDSf4:"); }
else if (self == SPS_STATE) { STR_APPEND(log, "SPS :"); }
else if (self == FSS_STATE) { STR_APPEND(log, "FSS :"); }
else if (self == FCS_STATE) { STR_APPEND(log, "FCS :"); }
STR_APPEND(log, "(%d) -- %2d -->(%d)\n", old_state, input, new_state);
return ans;
}
static int stateobj_start_spy(struct state_object * stateobj)
{
if (!StateTransition)
StateTransition = (void *)stateobj->StateTransition_maybe;
else if ((void*)StateTransition != (void*)stateobj->StateTransition_maybe) // make sure all states use the same transition function
{
beep();
return;
}
stateobj->StateTransition_maybe = (void *)stateobj_spy;
return 0; //not used currently
}
static void shootspy_init(void* unused)
{
log[0] = 0;
stateobj_start_spy(SCS_STATE);
stateobj_start_spy(SCSES_STATE);
stateobj_start_spy(SCSSR_STATE);
stateobj_start_spy(SBS_STATE);
stateobj_start_spy(SDS_REAR_STATE);
stateobj_start_spy(SDS_FRONT1_STATE);
stateobj_start_spy(SDS_FRONT2_STATE);
stateobj_start_spy(SDS_FRONT3_STATE);
stateobj_start_spy(SDS_FRONT4_STATE);
stateobj_start_spy(SPS_STATE);
stateobj_start_spy(FSS_STATE);
stateobj_start_spy(FCS_STATE);
}
void save_log()
{
NotifyBox(1000, "%d ", strlen(log));
FILE* f = FIO_CreateFileEx(CARD_DRIVE"shoot.log");
FIO_WriteFile(f, UNCACHEABLE(log), strlen(log));
FIO_CloseFile(f);
beep();
}
INIT_FUNC("shootspy_init", shootspy_init);
if audio_struct.continuous_mem_buf /*off_0x2C, 0x26F8*/ != 0 /*NE*/:
AJ_guess_sortof_a_copy__FROM.R1__TO.R0__LEN.R2(audio_struct.continuous_mem_buf /*off_0x2C, 0x26F8*/, 0xff45715c: pointer to 0x46464952, 0x2ee24)
SamplingRate_bit_channel(0xbb80, 0x10, HALFWORD(*0xFF457172), 0x2ee00)
con_puts('\nSamplingRate = %d, bit = %d, channel = %d\n', arg0, arg1, arg2) => ret_con_puts_FF064ED8
audio_struct.off_0x4 /*0x26D0*/ = BYTE(arg2)
audio_struct.off_0x60 /*0x272C*/ = arg3
audio_struct.continuous_mem_buf /*off_0x2C, 0x26F8*/ = 44 + audio_struct.continuous_mem_buf /*off_0x2C, 0x26F8*/
SetSamplingRate_FSamplingRate(arg0, 0x1)
src:ASIF\ASIF.c()
AJ_PowerAudioOutput()
Audio\AudioIC.c_hHPTimer(0x3)
*(-32 + sp0) = @called_by:SamplingRate_bit_channel
StartASIFDMADAC(44 + audio_struct.continuous_mem_buf /*off_0x2C, 0x26F8*/, arg3, 44 + audio_struct.continuous_mem_buf /*off_0x2C, 0x26F8*/, arg3)
hg clone https://bitbucket.org/hudson/magic-lantern
cd magic-lantern
hg up qemu -C
cd contrib/qemu
./install.sh
hg up unified -C
cd platform/550D.109
make clean && make zip
make install
make install_qemu
Quote from: dmilligan on May 02, 2014, 11:57:05 PM
Your question really boils down to this:
"Why can't I capture more information, by throwing away information?"
Now from a more practical standpoint:
Compression (what you refer to as "lowering the bitrate") is a difficult, computationally intensive task (it's also impossible). It is not a magical process where you throw some data in and it comes out smaller. The only way to get enough of an effective compression ratio for the incredibly huge size of a video data stream, is to just throw away some of it. The goal here being to throw out the least important information, but we are throwing away information nonetheless. The better an algorithm is at throwing away data (i.e. the better it is at figuring out what data is unimportant), typically the more complex it is. There are very easy ways to throw away data, such as reducing the resolution and line skipping, and there are very hard ways of throwing away data such as DCT
Lets now consider (a very oversimplified) pipeline that a video stream goes through in the camera:
Sensor -> Raw Data -> Image Processing (demosaic, wb, pic style, curves, etc.) -> H.264 Encoder -> Storage
When you talk of "bitrate" you are only talking about the bitrate at the very last step of this pipeline, the bitrate out of the encoder to the storage media. There are many other steps prior to this to consider. If you want a 1080p stream out of the encoder, you also need that 1080p stream to make it's way through the rest of that pipeline (at 60fps). That's where the limitation is, in fact there are probably many, I'll just go over some of the possible ones:
1. The H.264 encoder, can't handle 1080p of video data coming into it at 60 fps (remember it has to do something very complex and computationally intensive with the data and then spit out that result very quickly)
2. The image processing electronics can't handle 1080p of raw data at 60 fps
3. The internal buses that move the raw data from the sensor to the image processors can't handle that much data (1920*1080*14bit*60fps = 1.7 Gigabits per second)
4. The sensor itself isn't fast enough to sample 1080 lines at 60 fps (it takes some finite amount of time to read out each line, and they are read one by one)
I'm not saying that all of those are true, but at least one or more of them are, and that's why 60p mode is a lower resolution. Overcoming any of these obstacles is possible, but it would require more transistors (i.e. faster, more complicated electronics), which would make the camera more expensive. So without more expensive internal electronics, the only way to get enough "compression" to be able to even get our video data to the encoder, is to "compress" the data starting at the sensor itself, and what's the only way to do that? line skipping and reducing the resolution -> basically don't read in as many pixels.
Page created in 0.276 seconds with 14 queries.