Add movie.subframe_to_frame

This commit is contained in:
Ilari Liusvaara 2015-07-03 22:24:47 +03:00
parent 5e73a844a9
commit 6d1a67719b
5 changed files with 74 additions and 0 deletions

View file

@ -1243,6 +1243,10 @@ public:
* Find subframe number corresponding to given frame (1-based).
*/
int64_t find_frame(uint64_t n);
/**
* Find frame number corresponding to given subframe (0-based).
*/
int64_t subframe_to_frame(uint64_t n);
/**
* Notify sync flag polarity change.
*

19
lua.lyx
View file

@ -6704,6 +6704,25 @@ Returns starting subframe of given frame (frame numbers are 1-based).
Returns -1 if frame number is bad.
\end_layout
\begin_layout Subsection
movie.subframe_to_frame/INPUTMOVIE::subframe_to_frame: Find frame corresponding
to subframe
\end_layout
\begin_layout Itemize
Syntax: number movie.subframe_to_frame([INPUTMOVIE/string movie], number
subframe)
\end_layout
\begin_layout Itemize
Syntax: number INPUTMOVIE::subframe_to_frame(number subframe)
\end_layout
\begin_layout Standard
Returns frame containing given subframe (subframe numbers are 0-based).
Returns -1 if subframe number is bad.
\end_layout
\begin_layout Subsection
movie.blank_frame/INPUTMOVIE::blank_frame: Return a blank frame
\end_layout

BIN
lua.pdf

Binary file not shown.

View file

@ -819,6 +819,35 @@ int64_t frame_vector::find_frame(uint64_t n)
return -1;
}
int64_t frame_vector::subframe_to_frame(uint64_t n)
{
int64_t ret = 1;
uint64_t stride = get_stride();
uint64_t pageframes = get_frames_per_page();
uint64_t vsize = size();
if(n >= vsize) return -1;
size_t pagenum = 0;
size_t cpage = n / pageframes;
for(uint64_t p = 0; p < cpage; p++) {
const unsigned char* content = get_page_buffer(pagenum++);
size_t offset = 0;
for(unsigned i = 0; i < pageframes; i++) {
if(frame::sync(content + offset)) ret++;
offset += stride;
}
}
{
const unsigned char* content = get_page_buffer(pagenum++);
size_t offset = 0;
unsigned idx = n % pageframes;
for(unsigned i = 0; i < idx; i++) {
if(frame::sync(content + offset)) ret++;
offset += stride;
}
}
return ret;
}
frame::frame() throw()
{
memset(memory, 0, sizeof(memory));

View file

@ -226,6 +226,17 @@ namespace
return 1;
}
int _subframe_to_frame(lua::state& L, lua::parameters& P)
{
uint64_t n;
portctrl::frame_vector& v = framevector(L, P);
P(n);
L.pushnumber(v.subframe_to_frame(n));
return 1;
}
int _blank_frame(lua::state& L, lua::parameters& P)
{
portctrl::frame_vector& v = framevector(L, P);
@ -426,6 +437,10 @@ namespace
{
return _find_frame(L, P);
}
int subframe_to_frame(lua::state& L, lua::parameters& P)
{
return _subframe_to_frame(L, P);
}
int blank_frame(lua::state& L, lua::parameters& P)
{
return _blank_frame(L, P);
@ -507,6 +522,11 @@ namespace
return _find_frame(L, P);
}
int subframe_to_frame(lua::state& L, lua::parameters& P)
{
return _subframe_to_frame(L, P);
}
int blank_frame(lua::state& L, lua::parameters& P)
{
return _blank_frame(L, P);
@ -628,6 +648,7 @@ namespace
{"get_size", &lua_inputmovie::get_size},
{"count_frames", &lua_inputmovie::count_frames},
{"find_frame", &lua_inputmovie::find_frame},
{"subframe_to_frame", &lua_inputmovie::subframe_to_frame},
{"blank_frame", &lua_inputmovie::blank_frame},
{"append_frames", &lua_inputmovie::append_frames},
{"append_frame", &lua_inputmovie::append_frame},
@ -657,6 +678,7 @@ namespace
{"get_size", get_size},
{"count_frames", count_frames},
{"find_frame", find_frame},
{"subframe_to_frame", subframe_to_frame},
{"blank_frame", blank_frame},
{"append_frames", append_frames},
{"append_frame", append_frame},