brought to you by Deparment of Optics & Acoustics

the database

The Lytro Desktop stores metadata about the pictures and stories in a local database. The database is powered by SQLite, an engine storing data in isolated files. In this case, it is the database.db (library.db on Mac) file right in the Lytro library.

Not owning a Mac, I am unable to track updates there. See the archive page for Mac for database in the first version of the Lytro Desktop. The schema below is for version 3.

The database is required for the desktop software only. Although it too contains picture metadata, these are only duplicated from the picture files for performance purposes.

events, albums and pictures

Events, albums and pictures are the core building pieces of a library. Library is defined by a folder, each library has its own database. The process of importing anything into the library makes an event. In previous versions, users could name the individual events (stories) in order to group several pictures, however, this feature was replaced by the concept of albums. A library has a set of albums, and each album has a set of pictures.

tables

event
id (PK, int, not null)row identifier, autoincrement
uuid (text, not null)event id, unique
library_uuid (text, not null)id of the library the pictures were imported into
time (text, not null)timestamp of the import, yyyy-mmm-dd hh:MM:ss format
title (text, null)name of the story (legacy)

Each import creates a line in this table. Import always must happen into a library, if none is specified, a new one is created. If an old library with stories is imported, the names of the stories are preserved. Rows in this table are never deleted.

imported_picture_history
id (PK, int, not null)row identifier, autoincrement
hash (text, not null)picture hash

The purpose of the this table is to remember which pictures were already imported to the computer and which not. This is used when you connect a camera to the computer and want to see new pictures only. Note that these rows are not deleted either, so if you import a picture and delete it from the computer, it still will not be visible under new pictures.

As everywhere else, the hash used is SHA1. This is the value of /picture/derivationArray metadata in the picture.

album
id (PK, int, not null)row identifier, autoincrement
uuid (text, not null)album id, unique
name (text, not null)album name
description (text, not null)album description, currently not accessible from UI
creation_date (text, not null)timestamp of the album, yyyy-mmm-dd hh:MM:ss format
user_id (text, not null)not used, zero guids
flagged (integer, not null)not used, 0
public (integer, not null)not used, 1
sort_order (integer, not null)for custom album sort

Basic information about the albums. The unused fields are conspicuously similar to the fields that are used for publishing photos online. When an album is deleted, it is removed from the table.

picture
id (PK, int, not null)row identifier, autoincrement
uuid (int, not null)picture id, unique
hash (text, not null)picture hash
name (text, not null)LFP file name, or, img###### if imported from camera
imagebin_uuid (FK, text, not null)name of the folder in the library where the picture is
event_uuid (text, not null)import event id
caption (text, not null)picture title, currently not accessible from UI
capture_date (text, not null)when the picture was taken, yyyy-mm-dd hh:MM:ss format
import_date (text, not null)when the picture was imported, yyyy-mm-dd hh:MM:ss format
flag_status (int, not null)1 if picture marked as favorite, 0 otherwise
rating (int, not null)number of stars the picture received in the desktop application, -1 if rejected
image_height (int, not null)picture height in pixels
image_width (int, not null)picture width in pixels
aspect_ratio (real, not null)the ratio of picture width to height
lfe_state (int, not null)state of processing, zero bit — has refocus stack, first bit — has perspective stack
crop_width (int, not null)not used, 0
crop_height (int, not null)not used, 0
translation_x (int, not null)not used, 0
translation_y (int, not null)not used, 0

This is the primary table for pictures. The date fields can have 'not-a-date-time' value. Other suggests that we can expect cropping feature soon. When a picture is deleted, it is remove from the table. However, the folders (image bins) are kept on the disk even if all pictures in them are deleted. There is separate table, image_bin which just holds the name of the folders ever used.

picture_metadata
id (PK, int, not null)row identifier, autoincrement
uuid (FK, text, not null)picture id, unique
camera_serial_number (text, not null)camera serial number
camera_model (text, not null)0 Firefly (the only one published), 1 Blitzen
camera_mode (int, not null)1 Everyday Mode, 2 Creative Mode
demod_mode (int, not null)how image was demodulated, 0 wasn't, 1 using metadata, 2 using calibration data
lfe_minor (int, not null)light field engine minor version
lfe_major (int, not null)light field engine major version
refocus_lambda (real, not null)depth at which the picture was focused (the lesser number the closer to lens)
rotation (real, not null)number of degress counter-clockwise the picture was rotated (multiples of 90°)
orientation (real, not null)number of degress counter-clockwise the camera was rotated (multiples of 90°)
overscan (real, not null)? (either 0.0 or 1.05263 in my case, regardless of the camera used)
fnumber (real, not null)aperture the picture was taken with
iso (int, not null)sensitivity the picture was taken with
iso_set_manually (int, not null)0 automatic value, 1 manually set
focal_length (real, not null)zoom factor, for the A1 model ranging from 42.9064 to 340.8256
exposure (real, not null)exposure value (EV), should be 0.0 if automatic control was happy
internal_nd_used (int, not null)0 neutral-density filter off, 1 filter on
shutter_speed (real, not null)exposition time the picture was taken with
shutter_speed_set_manually (int, not null)0 automatic value, 1 manually set
depth_score (real, not null)0.0—1.0 score of how much depth is in the picture, -1.0 if not evaluated
postfilter_name (text, not null)the name of filter applied
affine_transform (text, not null)not used, empty

The metadata cached from the picture files, for the info panel of the desktop software. Modifying them does not modify the underlying files. From the previous releases, exposure is a new information, set even in the automatic control, as well as depth score. Affine transform might promise some feature to look forward for.

The post filter names can be: '8-Track', 'Blur+', 'Carnival', 'Crayon', 'Film Noir', 'Glass', 'Line Art', 'Mosaic' and 'Pop'.

Apart from the tables above, the database file contains also two system tables, library_metadata and sqlite_sequence. Database encoding is UTF-8.

thumbnails

In contrast to the previous versions (or Mac), thumbnails are now kept and managed together with the light field files, at the dimensions of 300×300 pixels.

When a camera is connected to the computer and thumbnails from it fetched, they are stored at %TEMP%\nitro\library, where they are kept even when the pictures are deleted, at the dimensions of 128×128 pixels.

Disclaimer: Jan Kučera and miloush.net are not affiliated with or endorsed by Lytro, Inc. and the above information is not confirmed.