camlib
Documentation for camlib is still a work-in-progress
Loading...
Searching...
No Matches
camlib.h
Go to the documentation of this file.
1
2// Main header file for Camlib
3// Copyright 2022 by Daniel C (https://github.com/petabyt/camlib)
4#ifndef PTP_LIB_H
5#define PTP_LIB_H
6
7#include <stdio.h>
8#include <stdint.h>
9#include <pthread.h>
10
11#include "ptp.h"
12
13// Max timeout for command read/writes
14#define PTP_TIMEOUT 1000
15
16// How much ms to wait for r->wait_for_response
17#define CAMLIB_WAIT_MS 1000
18
19// Conforms to POSIX 2001, some compilers may not have it
20#ifndef CAMLIB_SLEEP
21 #include <unistd.h>
22 //int usleep(unsigned int usec);
23 #define CAMLIB_SLEEP(ms) usleep(ms * 1000)
24#endif
25
26// Logging+panic mechanism, define it yourself or link in log.c
27void ptp_verbose_log(char *fmt, ...);
28__attribute__ ((noreturn)) void ptp_panic(char *fmt, ...);
29
30// 1mb default buffer size
31#define CAMLIB_DEFAULT_SIZE 1000000
32
35 PTP_OK = 0,
36 PTP_NO_DEVICE = -1,
37 PTP_NO_PERM = -2,
38 PTP_OPEN_FAIL = -3,
39 PTP_OUT_OF_MEM = -4,
40 PTP_IO_ERR = -5,
41 PTP_RUNTIME_ERR = -6,
42 PTP_UNSUPPORTED = -7,
43 PTP_CHECK_CODE = -8,
44 PTP_CANCELED = -9,
45};
46
48const char *ptp_perror(int rc);
49
50enum PtpLiveViewType {
51 PTP_LV_NONE = 0,
52 PTP_LV_EOS = 1,
53 PTP_LV_CANON = 2,
54 PTP_LV_ML = 3, // ptplv v1
55 PTP_LV_EOS_ML_BMP = 4, // ptplv v2
56};
57
60 PTP_DEV_EMPTY = 0,
61 PTP_DEV_EOS = 1,
62 PTP_DEV_CANON = 2,
63 PTP_DEV_NIKON = 3,
64 PTP_DEV_SONY = 4,
65 PTP_DEV_FUJI = 5,
66 PTP_DEV_PANASONIC = 6,
67};
68
69// Wrapper types for vendor specific capture modes
70enum ImageFormats {
71 IMG_FORMAT_ETC = 0,
72 IMG_FORMAT_RAW = 1,
73 IMG_FORMAT_STD = 2,
74 IMG_FORMAT_HIGH = 3,
75 IMG_FORMAT_RAW_JPEG = 4,
76};
77
80 PTP_IP = (1 << 0),
81 PTP_IP_USB = (1 << 1), // TCP-based, but using USB-style packets (Fujifilm)
82 PTP_USB = (1 << 2),
83};
84
87 void *next;
88 void *prev;
89 int code;
90 int memb_size;
91 int memb_cnt;
92 void *data;
93};
94
97struct PtpRuntime {
102
106
109 int session;
110
113 uint8_t *data;
114 int data_length;
115
119
122 struct PtpDeviceInfo *di;
123 int device_type;
124
128
131
132 void *userdata;
133
135 pthread_mutex_t *mutex;
136
140
143
147};
148
151 uint16_t code;
152 const char *name;
153 int value;
154 const char *str_value;
155};
156
159 uint16_t code;
160 uint32_t params[5];
161 int param_length;
162 int data_length;
163};
164
166struct PtpArray {
167 uint32_t length;
168 uint32_t data[];
169};
170
175
180
184uint32_t ptp_get_param(struct PtpRuntime *r, int i);
185
190
194uint8_t *ptp_get_payload(struct PtpRuntime *r);
195
200
203struct PtpRuntime *ptp_new(int options);
204
208void ptp_reset(struct PtpRuntime *r);
209
212void ptp_init(struct PtpRuntime *r);
213
216void ptp_close(struct PtpRuntime *r);
217
220int ptp_send(struct PtpRuntime *r, struct PtpCommand *cmd);
221
224int ptp_send_data(struct PtpRuntime *r, struct PtpCommand *cmd, void *data, int length);
225
228int ptp_get_event(struct PtpRuntime *r, struct PtpEventContainer *ec);
229
233
240
244
249
253int ptp_check_opcode(struct PtpRuntime *r, int opcode);
254
258int ptp_check_prop(struct PtpRuntime *r, int code);
259
263int ptp_buffer_resize(struct PtpRuntime *r, size_t size);
264
265int ptp_write_unicode_string(char *dat, char *string);
266int ptp_read_unicode_string(char *buffer, char *dat, int max);
267int ptp_read_utf8_string(void *dat, char *string, int max);
268int ptp_read_string(uint8_t *dat, char *string, int max);
269int ptp_write_string(uint8_t *dat, char *string);
270int ptp_write_utf8_string(void *dat, char *string);
271int ptp_read_uint16_array(uint8_t *dat, uint16_t *buf, int max, int *length);
272int ptp_read_uint16_array_s(uint8_t *bs, uint8_t *be, uint16_t *buf, int max, int *length);
273inline static int ptp_write_u8 (void *buf, uint8_t out) { ((uint8_t *)buf)[0] = out; return 1; }
274inline static int ptp_write_u16(void *buf, uint16_t out) { ((uint16_t *)buf)[0] = out; return 2; }
275inline static int ptp_write_u32(void *buf, uint32_t out) { ((uint32_t *)buf)[0] = out; return 4; }
276inline static int ptp_read_u32 (void *buf, uint32_t *out) { *out = ((uint32_t *)buf)[0]; return 4; }
277inline static int ptp_read_u16 (void *buf, uint16_t *out) { *out = ((uint16_t *)buf)[0]; return 2; }
278inline static int ptp_read_u8 (void *buf, uint8_t *out) { *out = ((uint8_t *)buf)[0]; return 1; }
279
280// Build a new PTP/IP or PTP/USB command packet in r->data
281int ptp_new_cmd_packet(struct PtpRuntime *r, struct PtpCommand *cmd);
282
283// Only for PTP_USB or PTP_USB_IP use
284int ptp_new_data_packet(struct PtpRuntime *r, struct PtpCommand *cmd, void *data, int data_length);
285
286// Only use for PTP_IP
287int ptpip_data_start_packet(struct PtpRuntime *r, int data_length);
288int ptpip_data_end_packet(struct PtpRuntime *r, void *data, int data_length);
289
290// Used only by ptp_open_session
291void ptp_update_transaction(struct PtpRuntime *r, int t);
292
293// Set avail info for prop
294void ptp_set_prop_avail_info(struct PtpRuntime *r, int code, int memb_size, int cnt, void *data);
295
296void *ptp_dup_payload(struct PtpRuntime *r);
297
298// Write r->data to a file called DUMP
299int ptp_dump(struct PtpRuntime *r);
300
301#define CAMLIB_INCLUDE_IMPL
302#include "cl_data.h"
303#include "cl_backend.h"
304#include "cl_ops.h"
305#include "cl_enum.h"
306#include "cl_bind.h"
307
308// Backwards compatibility (mostly renamed functions)
309#ifndef CAMLIB_NO_COMPAT
310 #define ptp_get_last_transaction(...) ptp_get_last_transaction_id(__VA_ARGS__)
311 #define ptp_generic_new(...) ptp_new(__VA_ARGS__)
312 #define ptp_generic_close(...) ptp_close(__VA_ARGS__)
313 #define ptp_generic_reset(...) ptp_reset(__VA_ARGS__)
314 #define ptp_generic_init(...) ptp_init(__VA_ARGS__)
315 #define ptp_generic_send(...) ptp_send(__VA_ARGS__)
316 #define ptp_generic_send_data(...) ptp_send_data(__VA_ARGS__)
317#endif
318
319#endif
const char * ptp_perror(int rc)
Evaluates PtpGeneralError into string message.
PtpConnType
Tells lib what backend and packet style to use.
Definition camlib.h:79
PtpGeneralError
Camlib library errors, not PTP return codes.
Definition camlib.h:34
PtpVendors
Unique camera types - each type should have similar opcodes and behavior.
Definition camlib.h:59
Generic Struct for arrays.
Definition camlib.h:166
Generic PTP command structure - accepted by operation API.
Definition camlib.h:158
Generic event / property change.
Definition camlib.h:150
Linked list to handle currently possible values for a property.
Definition camlib.h:86
Holds all camlib instance info.
Definition camlib.h:97
struct PtpRuntime * ptp_new(int options)
Allocate new PtpRuntime based on bitfield options - see PtpConnType.
void ptp_reset(struct PtpRuntime *r)
Reset all session-specific fields of PtpRuntime - both libusb and libwpd backends call this before es...
uint8_t io_kill_switch
Set to 1 to kill all IO operations. By default, this is 1. When a valid connection is achieved by lib...
Definition camlib.h:101
int ptp_send_data(struct PtpRuntime *r, struct PtpCommand *cmd, void *data, int length)
Send a command request to the device with a data phase (thread safe)
int ptp_get_param_length(struct PtpRuntime *r)
Get number of parameters in packet in data buffer.
uint8_t response_wait_default
Default value for wait_for_response.
Definition camlib.h:142
void ptp_close(struct PtpRuntime *r)
Frees PtpRuntime data buffer - doesn't free the actual structure, or device info (yet)
int ptp_get_event(struct PtpRuntime *r, struct PtpEventContainer *ec)
Try and get an event from the camera over int endpoint (USB-only)
int ptp_get_return_code(struct PtpRuntime *r)
Returns the return code (RC) currently in the data buffer.
void * comm_backend
For session comm/io structures (holds backend instance pointers)
Definition camlib.h:130
int ptp_check_prop(struct PtpRuntime *r, int code)
Check if a property code is supported by looking through supported props in r->di.
int ptp_send(struct PtpRuntime *r, struct PtpCommand *cmd)
Send a command request to the device with no data phase.
void ptp_init(struct PtpRuntime *r)
Init PtpRuntime locally - uses default recommended settings (USB)
uint8_t * data
Global buffer for data reading and writing.
Definition camlib.h:113
int ptp_get_payload_length(struct PtpRuntime *r)
Get length of payload returned by ptp_get_payload.
uint8_t * ptp_get_payload(struct PtpRuntime *r)
Get ptr of packet payload in data buffer, after packet header.
struct PtpPropAvail * avail
For devices that implement it, this will hold a linked list of properties and an array of their suppo...
Definition camlib.h:146
int ptp_get_last_transaction_id(struct PtpRuntime *r)
Get transaction ID of packet in the data buffer.
int transaction
Definition camlib.h:108
void ptp_mutex_keep_locked(struct PtpRuntime *r)
Keep the mutex locked one more time for the current thread.
void ptp_mutex_lock(struct PtpRuntime *r)
Lock the IO mutex - only should be used by backend.
int max_packet_size
Definition camlib.h:118
pthread_mutex_t * mutex
Optional (see CAMLIB_DONT_USE_MUTEX)
Definition camlib.h:135
int data_phase_length
For Windows compatibility, this is set to indicate lenth for a data packet that will be sent after a ...
Definition camlib.h:127
int ptp_buffer_resize(struct PtpRuntime *r, size_t size)
Mostly for internal use - realloc the data buffer.
uint32_t ptp_get_param(struct PtpRuntime *r, int i)
Get parameter at index i.
struct PtpDeviceInfo * di
Info about current connection, used to detect camera type, supported opodes, etc.
Definition camlib.h:122
uint8_t wait_for_response
Optionally wait up to 256 seconds for a response. Some PTP operations require this,...
Definition camlib.h:139
int ptp_check_opcode(struct PtpRuntime *r, int opcode)
Check if an opcode is supported by looking through supported props in r->di.
uint8_t connection_type
One of enum PtpConnType.
Definition camlib.h:105
void ptp_mutex_unlock(struct PtpRuntime *r)
Unlock the IO mutex (unless it was kept locked)
int ptp_device_type(struct PtpRuntime *r)
Gets type of device from r->di.