Commit 6be06d67 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

Before overlapping raw write

parent 8ec453e8
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.864295621" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include&quot;"/>
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include-uapi&quot;"/>
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include/ogg&quot;"/>
								</option>
								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2002029678" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
							</tool>
@@ -34,6 +35,7 @@
								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.1604866480" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include&quot;"/>
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include-uapi&quot;"/>
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include/ogg&quot;"/>
								</option>
								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1399974758" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
									<listOptionValue builtIn="false" value="__arm__=1"/>
@@ -51,6 +53,7 @@
								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.1372301239" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include&quot;"/>
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include-uapi&quot;"/>
									<listOptionValue builtIn="false" value="&quot;${PWD}/sysroots/usr/include/ogg&quot;"/>
								</option>
								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.308294150" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
							</tool>
+5 −5
Original line number Diff line number Diff line
@@ -573,7 +573,7 @@ int sendImageFrame(camogm_state *state)
	}
// is the frame ready?
	if (lseek(state->fd_circ[port], LSEEK_CIRC_READY, SEEK_END) < 0) {
		D3(fprintf(debug_file, "?6,fp=0x%x ", fp));     //frame not ready, frame pointer seems valid, but not ready
		D3(fprintf(debug_file, "?6,fp=0x%x\n", fp));     //frame not ready, frame pointer seems valid, but not ready
		return -CAMOGM_FRAME_NOT_READY;                 // frame pointer valid, but no frames yet
	}

@@ -583,7 +583,7 @@ int sendImageFrame(camogm_state *state)
//optionally save it to global read pointer (i.e. for debugging with imgsrv "/pointers")
		if (state->save_gp) lseek(state->fd_circ[port], LSEEK_CIRC_SETP, SEEK_END);
		state->frames_skip_left[port]--;
		D3(fprintf(debug_file, "?7 ")); //frame not ready
		D3(fprintf(debug_file, "?7\n")); //frame not ready
		return -CAMOGM_FRAME_NOT_READY; // the required frame is not ready
	}

@@ -691,7 +691,7 @@ int sendImageFrame(camogm_state *state)
		state->packetchunks[state->chunk_index++].chunk = (unsigned char*)&ccam_dma_buf[state->port_num][state->cirbuf_rp[port] >> 2];
		state->writer_params.segments = 1;
	}
	D3(fprintf(debug_file, "\tcirbuf_rp = 0x%x\t", state->cirbuf_rp[port]));
	D3(fprintf(debug_file, "\tcirbuf_rp[%d] = 0x%x\t", port, state->cirbuf_rp[port]));
	D3(fprintf(debug_file, "_12_"));
	if (state->this_frame_params[port].color != COLORMODE_RAW) { // Tiff
		state->packetchunks[state->chunk_index  ].bytes = 2;
@@ -1673,10 +1673,10 @@ int listener_loop(camogm_state *state)
			}
#endif
		} else if (state->prog_state == STATE_RUNNING) { // no commands in queue, started

			D6(fprintf(debug_file, "state->prog_state == STATE_RUNNING "));
			switch ((rslt = -sendImageFrame(state))) {
			rslt = -sendImageFrame(state);
			D6(fprintf(debug_file, " ==> %d",rslt));
			switch (rslt) {
			case 0:
				break;                      // frame sent OK, nothing to do (TODO: check file length/duration)
			case CAMOGM_FRAME_NOT_READY:    // just wait for the frame to appear at the current pointer
+38 −6
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@

/** @brief This define is needed to use lseek64 and should be set before includes */
#define _LARGEFILE64_SOURCE

#define ALIGN_INTERFRAME // New alignment mode - add zeros between frames (TIFF also), not inside JPEG with app15 (JPEG only)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
@@ -31,6 +31,7 @@ static unsigned char app15[ALIGNMENT_SIZE] = {0xff, 0xef};
static inline size_t get_size_from(const struct iovec *vects, int index, size_t offset, int all);
static inline size_t align_bytes_num(size_t data_len, size_t align_len);
static inline void vectcpy(struct iovec *dest, void *src, size_t len);
static inline void vectset(struct iovec *dest, int src, size_t len);
static inline void vectshrink(struct iovec *vec, size_t len);
static inline void vectshrinkhead(struct iovec *vec, size_t len);
static inline unsigned char *vectrpos(struct iovec *vec, size_t offset);
@@ -61,6 +62,17 @@ static inline void vectcpy(struct iovec *dest, void *src, size_t len)
	dest->iov_len += len;
}

/** Set @e len bytes with @e src to buffer pointed by @e dest vector */
static inline void vectset(struct iovec *dest,  int src, size_t len)
{
	unsigned char *d = (unsigned char *)dest->iov_base;

	memset(d + dest->iov_len, src, len);
	dest->iov_len += len;
}



/** Shrink vector length by @len bytes */
static inline void vectshrink(struct iovec *vec, size_t len)
{
@@ -110,7 +122,7 @@ static inline size_t get_size_from(const struct iovec *vects, int index, size_t
	return total;
}

/** Return the number of bytes needed to align @e data_len to @e align_len boundary */
/** Return the number of bytes needed to be inserted to align @e data_len to @e align_len boundary */
static inline size_t align_bytes_num(size_t data_len, size_t align_len)
{
	size_t rem = data_len % align_len;
@@ -160,10 +172,12 @@ static void remap_vectors(camogm_state *state, struct iovec *chunks)
		chunks[CHUNK_DATA_1].iov_base = chunks[CHUNK_DATA_0].iov_base;
		chunks[CHUNK_DATA_1].iov_len =  0;
	}
	chunks[CHUNK_TRAILER].iov_base = (void *)state->packetchunks[chunk_index].chunk;
//	chunks[CHUNK_TRAILER].iov_base = (void *)state->packetchunks[chunk_index].chunk;
	if (is_tiff) { // Tiff
		chunks[CHUNK_TRAILER].iov_base = (void *)state->packetchunks[chunk_index-1].chunk; // last used chunk (valid)
		chunks[CHUNK_TRAILER].iov_len = 0;
	} else {
		chunks[CHUNK_TRAILER].iov_base = (void *)state->packetchunks[chunk_index].chunk;
		chunks[CHUNK_TRAILER].iov_len = state->packetchunks[chunk_index].bytes;
	}

@@ -288,7 +302,7 @@ void align_frame(camogm_state *state)
	remap_vectors(state, chunks);

	total_sz = get_size_from(chunks, 0, 0, INCLUDE_REM) + rbuff->iov_len;
	D4(fprintf(debug_file, "total_sz = %d\n", total_sz));
	D4(fprintf(debug_file, "total_sz = %d, rbuff->iov_len=%d\n", total_sz, (int)(rbuff->iov_len)));
	if (total_sz < PHY_BLOCK_SIZE) {
		/* the frame length is less than sector size, delay this frame */
		if (rbuff->iov_len != 0) {
@@ -321,6 +335,14 @@ void align_frame(camogm_state *state)
		vectshrink(rbuff, rbuff->iov_len);
	}

	/*Calculate alignment size and add zeros here*/
#ifdef ALIGN_INTERFRAME
	// calculate length after adding CHUNK_LEADER, CHUNK_EXIF and CHUNK_HEADER to the current cbuf
	data_len = cbuff->iov_len + chunks[CHUNK_LEADER].iov_len + chunks[CHUNK_EXIF].iov_len+ chunks[CHUNK_HEADER].iov_len;
	len = align_bytes_num(data_len, ALIGNMENT_SIZE);
	dev_dbg(dev, "total number of stuffing bytes between frames: %u\n", len);
	vectset(cbuff,  0, len);
#endif
	/* copy JPEG marker if present */
	if (chunks[CHUNK_LEADER].iov_len != 0) {
		len = chunks[CHUNK_LEADER].iov_len;
@@ -336,6 +358,16 @@ void align_frame(camogm_state *state)
		vectshrink(&chunks[CHUNK_EXIF], chunks[CHUNK_EXIF].iov_len);
	}

#ifdef ALIGN_INTERFRAME
	/* copy JPEG JPEG header data excluding leading marker if present */
	if (chunks[CHUNK_HEADER].iov_len != 0) {
		len = chunks[CHUNK_HEADER].iov_len;
		dev_dbg(dev, "copy %u bytes from LEADER to common buffer\n", len);
		vectcpy(cbuff, chunks[CHUNK_HEADER].iov_base, len);
		vectshrink(&chunks[CHUNK_HEADER], chunks[CHUNK_HEADER].iov_len);
	}

#else	// old way with app15
	if (chunks[CHUNK_HEADER].iov_len != 0){ // only if it is not TIFF
		/* align common buffer to ALIGNMENT boundary, APP15 marker should be placed before header data */
		data_len = cbuff->iov_len + chunks[CHUNK_HEADER].iov_len;
@@ -362,13 +394,13 @@ void align_frame(camogm_state *state)
			vectshrinkhead(&chunks[CHUNK_DATA_0],len);
		}
	}

#endif

	/* check if there is enough data to continue - JPEG data length can be too short */
	len = get_size_from(chunks, CHUNK_DATA_0, 0, EXCLUDE_REM);
	if (len < PHY_BLOCK_SIZE) {
		size_t num = align_bytes_num(cbuff->iov_len, PHY_BLOCK_SIZE);
		dev_dbg(dev, "jpeg data is too short, delay this frame\n");
		dev_dbg(dev, "jpeg data is too short, delay this frame\n"); // never happened?
		if (len >= num) {
			/* there is enough data to align common buffer to sector boundary */
			if (num >= chunks[CHUNK_DATA_0].iov_len) {
+12 −7
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ def get_disk_size(dev_path):
        return 0
    if (label == 'unknown'):
        #print("unknown label, running parted -s /dev/sda mklabel msdos!")
        print ("Disregard 'Error: /dev/sda: unrecognised disk label' above ")
        try:
            parted_print = subprocess.check_output(['parted', '-s', dev_path, 'mklabel', 'msdos'])
        except:
@@ -266,7 +267,7 @@ if __name__ == "__main__":
    parser = argparse.ArgumentParser(description = "Prepare and partition new disk for fast recording from camogm")
    parser.add_argument('disk_path', nargs = '?', help = "path to a disk which should be partitioned, e.g /dev/sda")
    parser.add_argument('-l', '--list',       action = 'store_true', help = "list attached disk(s) suitable for partitioning along " + 
    "with their totals sizes and possible system partition sizes separated by colon")
    "with their totals sizes and possible system partition sizes separated by colon. -lf - include already partitioned.")
    parser.add_argument('-e', '--errno', nargs = 1, type = int, help = "convert error number returned by the script to error message")
    parser.add_argument('-d', '--dry_run',    action = 'store_true', help = "execute the script but do not actually create partitions")
    parser.add_argument('-f', '--force',      action = 'store_true', help = "force 'mkfs' to create a file system and re-format existing partitions")
@@ -295,18 +296,19 @@ if __name__ == "__main__":
            disks = find_disks(True)
            if disks:
                disk_path = disks[0]
        """        
        if (disk_path != ""):
            print (disk_path)        
        else:
            print ("disk_path empty")
        """            

#        if (disk_path != ""):
#            print (disk_path) #first line output        
#        else:
#            print ("disk_path empty")
            
        if (disk_path != ""):
            with open("/proc/mounts", "r") as file:
                content = file.read()
            if (content.find(disk_path) > 0): # <0 - not founed
#                print (disk_path+" is mounted")
                mount_point = content[content.find(disk_path):].split()[1]
#                print ("mount_point=",mount_point)        
                # try to unmount
                try:
                    subprocess.check_output(['umount', mount_point])
@@ -315,6 +317,8 @@ if __name__ == "__main__":
                    ret_code.err_code = ErrCodes.PART_MOUINTED
                    print(ret_code.err2str())
                    sys.exit(ret_code.err_code)
#                print ("umount")        
    
            disk_name = disk_path[:8]# /dev/sdx
            #delete MBR on this device : dd if=/dev/zero of=/dev/sda bs=512 count=1
            try:
@@ -361,6 +365,7 @@ if __name__ == "__main__":
                ret_code.err_code = ErrCodes.WRONG_PATH
        else:
            ret_code.err_code = ErrCodes.WRONG_PATH
    
        if ret_code.err_code != ErrCodes.OK:
            print(ret_code.err2str())
            sys.exit(ret_code.err_code)