]> git.sesse.net Git - nageru/log
nageru
8 years agoRename H264Encoder to QuickSyncEncoder, since we will be splitting out the non-QuickS...
Steinar H. Gunderson [Sat, 23 Apr 2016 19:53:11 +0000 (21:53 +0200)]
Rename H264Encoder to QuickSyncEncoder, since we will be splitting out the non-QuickSync parts from it soon.

8 years agoDon't check AVFMT_ALLOW_FLUSH
Martin Storsjö [Wed, 20 Apr 2016 11:48:33 +0000 (14:48 +0300)]
Don't check AVFMT_ALLOW_FLUSH

This check is redundant, av_write_frame does a similar check
internally already. The caller is not supposed to need to know/care
about this.

8 years agoSet duration for all video frames.
Steinar H. Gunderson [Tue, 19 Apr 2016 21:46:26 +0000 (23:46 +0200)]
Set duration for all video frames.

Generally the muxer will ignore these, but there's one specific case
where it cannot: Since we flush before keyframes, the mov (MP4) mux
will not be able to set a proper duration based on the next frame
(usually it just does next_dts - dts), and thus guesses that it will be
the same as the previous one. If we dropped a frame between those two,
the duration of said last frame will be wrong -- and the keyframe
(starting in the next fragment) will get the wrong pts, possibly
seemingly even going backwards.

If we lose a frame between the last frame and the keyframe, the pts
of the keyframe will still be a bit wonky, but according to wbs
(who wrote the mux), it's much better like so.

8 years agoScale duration correctly.
Steinar H. Gunderson [Tue, 19 Apr 2016 19:50:15 +0000 (21:50 +0200)]
Scale duration correctly.

8 years agoHook up SIGUSR1 for testing clean shutdown.
Steinar H. Gunderson [Tue, 19 Apr 2016 00:18:01 +0000 (02:18 +0200)]
Hook up SIGUSR1 for testing clean shutdown.

8 years agoFix a threading issue during shutdown (two threads would try to encode audio at the...
Steinar H. Gunderson [Tue, 19 Apr 2016 00:09:44 +0000 (02:09 +0200)]
Fix a threading issue during shutdown (two threads would try to encode audio at the same time).

8 years agoFix flag mismatches in the zerocopy diagnostics.
Steinar H. Gunderson [Tue, 19 Apr 2016 00:04:27 +0000 (02:04 +0200)]
Fix flag mismatches in the zerocopy diagnostics.

8 years agoDeal properly with audio at the end of the stream.
Steinar H. Gunderson [Mon, 18 Apr 2016 23:58:59 +0000 (01:58 +0200)]
Deal properly with audio at the end of the stream.

8 years agoMore shutdown issues with X264Encoder (still not fully there).
Steinar H. Gunderson [Mon, 18 Apr 2016 23:58:45 +0000 (01:58 +0200)]
More shutdown issues with X264Encoder (still not fully there).

8 years agoFix a shutdown issue in X264Encoder.
Steinar H. Gunderson [Mon, 18 Apr 2016 23:56:38 +0000 (01:56 +0200)]
Fix a shutdown issue in X264Encoder.

8 years agoRemove some debugging output.
Steinar H. Gunderson [Mon, 18 Apr 2016 23:25:45 +0000 (01:25 +0200)]
Remove some debugging output.

8 years agoMake X264Encoder possible to shut down.
Steinar H. Gunderson [Mon, 18 Apr 2016 23:14:28 +0000 (01:14 +0200)]
Make X264Encoder possible to shut down.

8 years agoAdd Metacube stream output (for Cubemap).
Steinar H. Gunderson [Mon, 18 Apr 2016 22:19:43 +0000 (00:19 +0200)]
Add Metacube stream output (for Cubemap).

8 years agoPut a global lock around glFenceSync/glDeleteSync calls, to workaround apitrace bug...
Steinar H. Gunderson [Mon, 18 Apr 2016 21:12:05 +0000 (23:12 +0200)]
Put a global lock around glFenceSync/glDeleteSync calls, to workaround apitrace bug #446. (Replaying Nageru calls using apitrace can be very useful, and it should not have any appreciable performance impact in practice.)

8 years agoSynchronize the Mux class, since both H264EncoderImpl and X264Encoder are writing...
Steinar H. Gunderson [Mon, 18 Apr 2016 17:35:18 +0000 (19:35 +0200)]
Synchronize the Mux class, since both H264EncoderImpl and X264Encoder are writing to it (from different threads).

8 years agoPut __restrict on the right place (the pointer; the pointee cannot be restricted...
Steinar H. Gunderson [Mon, 18 Apr 2016 14:39:03 +0000 (16:39 +0200)]
Put __restrict on the right place (the pointer; the pointee cannot be restricted). Fixes compilation with Clang.

8 years agoMake it possible to set x264 preset/tune from the command line.
Steinar H. Gunderson [Mon, 18 Apr 2016 14:16:41 +0000 (16:16 +0200)]
Make it possible to set x264 preset/tune from the command line.

8 years agoSeparate muxing entirely out of the HTTPD class.
Steinar H. Gunderson [Mon, 18 Apr 2016 13:24:16 +0000 (15:24 +0200)]
Separate muxing entirely out of the HTTPD class.

At some point, it was indeed more convenient to mux separately to everybody,
but muxing needs to know more stuff these days, so it was getting increasingly
ugly. This code follows roughly what VLC does to extract the header and various
block boundaries.

8 years agoCorrect audio pts for framing. Still something fishy around, though.
Steinar H. Gunderson [Sun, 17 Apr 2016 22:56:54 +0000 (00:56 +0200)]
Correct audio pts for framing. Still something fishy around, though.

8 years agoFix some small memory leaks (some bigger remain).
Steinar H. Gunderson [Sun, 17 Apr 2016 22:41:41 +0000 (00:41 +0200)]
Fix some small memory leaks (some bigger remain).

8 years agoFix a memory leak in audio encoding.
Steinar H. Gunderson [Sun, 17 Apr 2016 22:31:35 +0000 (00:31 +0200)]
Fix a memory leak in audio encoding.

8 years agoSet global headers to fix some issues with AAC over HTTP.
Steinar H. Gunderson [Sun, 17 Apr 2016 22:12:08 +0000 (00:12 +0200)]
Set global headers to fix some issues with AAC over HTTP.

8 years agoMore fixes for non-PCM HTTP audio codecs.
Steinar H. Gunderson [Sun, 17 Apr 2016 22:09:21 +0000 (00:09 +0200)]
More fixes for non-PCM HTTP audio codecs.

8 years agoRemove some debugging spew.
Steinar H. Gunderson [Sun, 17 Apr 2016 22:05:12 +0000 (00:05 +0200)]
Remove some debugging spew.

8 years agoSupport encoding the HTTP stream with x264. Highly experimental for now!
Steinar H. Gunderson [Sun, 17 Apr 2016 20:38:05 +0000 (22:38 +0200)]
Support encoding the HTTP stream with x264. Highly experimental for now!

8 years agoMake it possible for file and HTTP streams to use different audio codecs.
Steinar H. Gunderson [Sun, 17 Apr 2016 20:35:34 +0000 (22:35 +0200)]
Make it possible for file and HTTP streams to use different audio codecs.

8 years agoFix encoding to audio codecs that need a fixed frame size (e.g. mp3lame).
Steinar H. Gunderson [Sun, 17 Apr 2016 20:32:58 +0000 (22:32 +0200)]
Fix encoding to audio codecs that need a fixed frame size (e.g. mp3lame).

8 years agoPull the file muxing out of the HTTPD. (It was pretty ugly all along.)
Steinar H. Gunderson [Sun, 17 Apr 2016 19:46:15 +0000 (21:46 +0200)]
Pull the file muxing out of the HTTPD. (It was pretty ugly all along.)

8 years agoPull the Mux class out of HTTPD. (First step towards decoupling file and HTTP muxing.)
Steinar H. Gunderson [Sun, 17 Apr 2016 19:37:47 +0000 (21:37 +0200)]
Pull the Mux class out of HTTPD. (First step towards decoupling file and HTTP muxing.)

8 years agoChoose sample format on-the-fly instead of hard-coding it in defs.h.
Steinar H. Gunderson [Sun, 17 Apr 2016 16:16:40 +0000 (18:16 +0200)]
Choose sample format on-the-fly instead of hard-coding it in defs.h.

8 years agoReindent a function in H264EncoderImpl.
Steinar H. Gunderson [Sun, 17 Apr 2016 15:28:17 +0000 (17:28 +0200)]
Reindent a function in H264EncoderImpl.

8 years agoAdd an option --http-coarse-timebase for streaming to MP4.
Steinar H. Gunderson [Sun, 17 Apr 2016 15:24:05 +0000 (17:24 +0200)]
Add an option --http-coarse-timebase for streaming to MP4.

8 years agoRefactor out the logic for disabling zerocopy H.264 encoding.
Steinar H. Gunderson [Sun, 17 Apr 2016 13:47:42 +0000 (15:47 +0200)]
Refactor out the logic for disabling zerocopy H.264 encoding.

8 years agoMake it possible to override stream mux on the command line.
Steinar H. Gunderson [Sun, 17 Apr 2016 13:47:04 +0000 (15:47 +0200)]
Make it possible to override stream mux on the command line.

8 years agoMore precise PBO flushing (flush only the data we actually use, not the entire 8...
Steinar H. Gunderson [Fri, 15 Apr 2016 22:36:46 +0000 (00:36 +0200)]
More precise PBO flushing (flush only the data we actually use, not the entire 8 MB range).

8 years agoRelease Nageru 1.2.1. 1.2.1
Steinar H. Gunderson [Fri, 15 Apr 2016 20:45:55 +0000 (22:45 +0200)]
Release Nageru 1.2.1.

8 years agoMake it possible to schedule cuts using SIGHUP.
Steinar H. Gunderson [Fri, 15 Apr 2016 20:35:41 +0000 (22:35 +0200)]
Make it possible to schedule cuts using SIGHUP.

8 years agoAlways flush after setting a fence, since we could otherwise get unbounded delay...
Steinar H. Gunderson [Thu, 14 Apr 2016 08:24:26 +0000 (10:24 +0200)]
Always flush after setting a fence, since we could otherwise get unbounded delay. (Also, used to confuse apitrace, but that is fixed already.)

8 years agoSet one fence less in the case of non-zerocopy H.264 encoding.
Steinar H. Gunderson [Tue, 12 Apr 2016 17:21:30 +0000 (19:21 +0200)]
Set one fence less in the case of non-zerocopy H.264 encoding.

8 years agoAdd an option to not flush PBOs explicitly; causes apitrace not to store the data...
Steinar H. Gunderson [Sun, 10 Apr 2016 13:27:37 +0000 (15:27 +0200)]
Add an option to not flush PBOs explicitly; causes apitrace not to store the data to its trace, speeding it up massively.

8 years agoAdd usage information on invalid option or --help.
Steinar H. Gunderson [Sun, 10 Apr 2016 13:21:15 +0000 (15:21 +0200)]
Add usage information on invalid option or --help.

8 years agoMake fade progress actually go from 0 to 1, despite sigmoid at the end.
Steinar H. Gunderson [Sat, 9 Apr 2016 13:27:55 +0000 (15:27 +0200)]
Make fade progress actually go from 0 to 1, despite sigmoid at the end.

8 years agoSlightly better error message when get_chain() returns something bogus.
Steinar H. Gunderson [Sat, 9 Apr 2016 12:40:54 +0000 (14:40 +0200)]
Slightly better error message when get_chain() returns something bogus.

8 years agoExpose MultiplyEffect to themes.
Steinar H. Gunderson [Sat, 9 Apr 2016 12:39:03 +0000 (14:39 +0200)]
Expose MultiplyEffect to themes.

8 years agoFix reading of PNG images.
Steinar H. Gunderson [Sat, 9 Apr 2016 12:25:09 +0000 (14:25 +0200)]
Fix reading of PNG images.

8 years agoRefresh ImageInputs from disk every second. Not the most efficient or elegant way...
Steinar H. Gunderson [Sat, 9 Apr 2016 11:59:46 +0000 (13:59 +0200)]
Refresh ImageInputs from disk every second. Not the most efficient or elegant way of doing it, but it works for now.

8 years agoMake load_image() return nullptr instead of exit()-ing.
Steinar H. Gunderson [Sat, 9 Apr 2016 10:44:41 +0000 (12:44 +0200)]
Make load_image() return nullptr instead of exit()-ing.

Will be used when we implement image reload support soon.
In the process, RAII-ify everything in load_image(), so that
we can return nullptr at any given place without being worried
about resource leaks.

In the process, get rid of some deprecated FFmpeg API use.

8 years agoFix an issue where data would get corrupted if the client asked for chunked transfer...
Steinar H. Gunderson [Thu, 7 Apr 2016 21:00:08 +0000 (23:00 +0200)]
Fix an issue where data would get corrupted if the client asked for chunked transfer-encoding.

8 years agoRelease Nageru 1.2.0. 1.2.0
Steinar H. Gunderson [Wed, 6 Apr 2016 20:58:53 +0000 (22:58 +0200)]
Release Nageru 1.2.0.

8 years agoUpdate README for changed mux.
Steinar H. Gunderson [Wed, 6 Apr 2016 20:52:15 +0000 (22:52 +0200)]
Update README for changed mux.

8 years agoFix AV_PKT_FLAG_KEY behavior; non-IDR I-frames are not keyframes (they lack SPS infor...
Steinar H. Gunderson [Tue, 5 Apr 2016 21:02:48 +0000 (23:02 +0200)]
Fix AV_PKT_FLAG_KEY behavior; non-IDR I-frames are not keyframes (they lack SPS information), and all audio frames are keyframes.

8 years agoHook up some keyboard shortcuts for the transition buttons.
Steinar H. Gunderson [Tue, 5 Apr 2016 19:24:11 +0000 (21:24 +0200)]
Hook up some keyboard shortcuts for the transition buttons.

8 years agoSmall clarification in a variable name.
Steinar H. Gunderson [Tue, 5 Apr 2016 16:57:00 +0000 (18:57 +0200)]
Small clarification in a variable name.

8 years agoFix video in saved files.
Steinar H. Gunderson [Tue, 5 Apr 2016 16:56:43 +0000 (18:56 +0200)]
Fix video in saved files.

8 years agoAdd red and green borders around channels to mark them as used for live and preview.
Steinar H. Gunderson [Mon, 4 Apr 2016 21:46:11 +0000 (23:46 +0200)]
Add red and green borders around channels to mark them as used for live and preview.

8 years agoAdd an option --flat-audio to start with almost all the audio processing turned off.
Steinar H. Gunderson [Mon, 4 Apr 2016 19:32:12 +0000 (21:32 +0200)]
Add an option --flat-audio to start with almost all the audio processing turned off.

8 years agoAdd a command-line option to change themes.
Steinar H. Gunderson [Mon, 4 Apr 2016 19:27:26 +0000 (21:27 +0200)]
Add a command-line option to change themes.

8 years agoAdd support for uncompressed video instead of H.264 (while still storing H.264 to...
Steinar H. Gunderson [Mon, 4 Apr 2016 19:22:26 +0000 (21:22 +0200)]
Add support for uncompressed video instead of H.264 (while still storing H.264 to file).

Note that microhttpd and VLC is really inefficient for large data amounts, so
this is not actually a CPU win right now.

8 years agoFix a problem where the nut output would come way too uneven, given the VLC instance...
Steinar H. Gunderson [Sun, 3 Apr 2016 22:55:12 +0000 (00:55 +0200)]
Fix a problem where the nut output would come way too uneven, given the VLC instance too much to do at some times and too little others.

8 years agoFix yet another memory leak in the serving part.
Steinar H. Gunderson [Sun, 3 Apr 2016 20:10:11 +0000 (22:10 +0200)]
Fix yet another memory leak in the serving part.

8 years agoRemove some obsolete commented-out code.
Steinar H. Gunderson [Sun, 3 Apr 2016 19:07:52 +0000 (21:07 +0200)]
Remove some obsolete commented-out code.

8 years agoYet more ffmpeg leak fixes (one of them was created recently, though).
Steinar H. Gunderson [Sun, 3 Apr 2016 19:07:41 +0000 (21:07 +0200)]
Yet more ffmpeg leak fixes (one of them was created recently, though).

8 years agoFix infinite memory growth in the nut muxer.
Steinar H. Gunderson [Sun, 3 Apr 2016 17:26:56 +0000 (19:26 +0200)]
Fix infinite memory growth in the nut muxer.

8 years agoFix a memory leak in muxing.
Steinar H. Gunderson [Sun, 3 Apr 2016 15:39:10 +0000 (17:39 +0200)]
Fix a memory leak in muxing.

8 years agoChange mux to nut; mov seems to have issues in the VLC transcoding step.
Steinar H. Gunderson [Sun, 3 Apr 2016 15:38:35 +0000 (17:38 +0200)]
Change mux to nut; mov seems to have issues in the VLC transcoding step.

8 years agoAdd global headers if the mux wants it. (Although I am not sure if it might be a...
Steinar H. Gunderson [Sun, 3 Apr 2016 14:17:08 +0000 (16:17 +0200)]
Add global headers if the mux wants it. (Although I am not sure if it might be a lie for the H.264 stream...)

8 years agoAdd some (commented out) page poisoning code, for debugging use-after-free.
Steinar H. Gunderson [Sun, 3 Apr 2016 13:52:32 +0000 (15:52 +0200)]
Add some (commented out) page poisoning code, for debugging use-after-free.

8 years agoFix an issue in the H264 encoder where a surface could be rendered to while it was...
Steinar H. Gunderson [Sun, 3 Apr 2016 10:55:06 +0000 (12:55 +0200)]
Fix an issue in the H264 encoder where a surface could be rendered to while it was still encoding the previous frame.

8 years agoSome named constant tweaking in h264encode.cpp.
Steinar H. Gunderson [Sat, 2 Apr 2016 23:33:44 +0000 (01:33 +0200)]
Some named constant tweaking in h264encode.cpp.

8 years agoAdd a warning if we should start allocating more surfaces for the H.264 encoder.
Steinar H. Gunderson [Sat, 2 Apr 2016 23:18:01 +0000 (01:18 +0200)]
Add a warning if we should start allocating more surfaces for the H.264 encoder.

8 years agoTiny alias cleanup.
Steinar H. Gunderson [Sat, 2 Apr 2016 23:02:52 +0000 (01:02 +0200)]
Tiny alias cleanup.

8 years agoTweak queue length policy to avoid pointless safe point increases.
Steinar H. Gunderson [Sat, 2 Apr 2016 22:34:02 +0000 (00:34 +0200)]
Tweak queue length policy to avoid pointless safe point increases.

8 years agoCleanup: Remove the last case of non-refcounted fences.
Steinar H. Gunderson [Sat, 2 Apr 2016 22:14:53 +0000 (00:14 +0200)]
Cleanup: Remove the last case of non-refcounted fences.

8 years agoRevert back to glFlushMappedBufferRange; buggy on ATI or not, glMemoryBarrier is...
Steinar H. Gunderson [Sat, 2 Apr 2016 20:42:30 +0000 (22:42 +0200)]
Revert back to glFlushMappedBufferRange; buggy on ATI or not, glMemoryBarrier is only for changes from the server to the client, not the only way around.

8 years agoFix an integer wraparound issue.
Steinar H. Gunderson [Sat, 2 Apr 2016 18:17:30 +0000 (20:17 +0200)]
Fix an integer wraparound issue.

8 years agoClearly mark card type in the description.
Steinar H. Gunderson [Sat, 2 Apr 2016 17:29:23 +0000 (19:29 +0200)]
Clearly mark card type in the description.

8 years agoMake it possible to choose which card is the master clock.
Steinar H. Gunderson [Sat, 2 Apr 2016 17:27:01 +0000 (19:27 +0200)]
Make it possible to choose which card is the master clock.

8 years agoAnother split-out from thread_func; this time schedule_audio_resampling_tasks().
Steinar H. Gunderson [Sat, 2 Apr 2016 15:36:55 +0000 (17:36 +0200)]
Another split-out from thread_func; this time schedule_audio_resampling_tasks().

8 years agoMore splitting of functions out of thread_func().
Steinar H. Gunderson [Sat, 2 Apr 2016 15:26:53 +0000 (17:26 +0200)]
More splitting of functions out of thread_func().

8 years agoA little refactoring in render_one_frame().
Steinar H. Gunderson [Sat, 2 Apr 2016 15:10:15 +0000 (17:10 +0200)]
A little refactoring in render_one_frame().

8 years agoRemove an outdated/misplaced comment.
Steinar H. Gunderson [Sat, 2 Apr 2016 14:44:49 +0000 (16:44 +0200)]
Remove an outdated/misplaced comment.

8 years agoAdd a system for queue length policies, so that we have as little as possible (but...
Steinar H. Gunderson [Sat, 2 Apr 2016 13:22:11 +0000 (15:22 +0200)]
Add a system for queue length policies, so that we have as little as possible (but no less) delay between inputs.

8 years agoMake a symbolic constant for master_card_index, instead of writing 0 everywhere.
Steinar H. Gunderson [Sat, 2 Apr 2016 12:44:33 +0000 (14:44 +0200)]
Make a symbolic constant for master_card_index, instead of writing 0 everywhere.

8 years agoMake the internal frame queue multiframe.
Steinar H. Gunderson [Sat, 2 Apr 2016 12:35:56 +0000 (14:35 +0200)]
Make the internal frame queue multiframe.

This essentially moves the queue from the driver until our own mixer;
mainly because we want to measure the queue length, but it also gets
rid of the rather ugly card_copy concept.

8 years agoFix crashes when cards deliver empty audio frames (especially 0-channel).
Steinar H. Gunderson [Fri, 1 Apr 2016 21:06:07 +0000 (23:06 +0200)]
Fix crashes when cards deliver empty audio frames (especially 0-channel).

8 years agoAllow setting the video and audio inputs runtime.
Steinar H. Gunderson [Fri, 1 Apr 2016 21:00:50 +0000 (23:00 +0200)]
Allow setting the video and audio inputs runtime.

8 years agoStart a mux only on a keyframe, so that transcoding clients do not get too confused.
Steinar H. Gunderson [Fri, 1 Apr 2016 08:34:32 +0000 (10:34 +0200)]
Start a mux only on a keyframe, so that transcoding clients do not get too confused.

8 years agoDelete streams when they are closed (prevents memory leak on disconnecting clients).
Steinar H. Gunderson [Thu, 31 Mar 2016 22:07:59 +0000 (00:07 +0200)]
Delete streams when they are closed (prevents memory leak on disconnecting clients).

8 years agoFix issues with newer ffmpeg.
Steinar H. Gunderson [Thu, 31 Mar 2016 18:57:35 +0000 (20:57 +0200)]
Fix issues with newer ffmpeg.

8 years agoAdd an option to scan through all possible modes for the PCI cards, as a substitute...
Steinar H. Gunderson [Fri, 4 Mar 2016 22:52:37 +0000 (23:52 +0100)]
Add an option to scan through all possible modes for the PCI cards, as a substitute for autodetection.

8 years agoMake the theme print out the resolution even if there is no signal. Useful for the...
Steinar H. Gunderson [Fri, 4 Mar 2016 22:49:05 +0000 (23:49 +0100)]
Make the theme print out the resolution even if there is no signal. Useful for the coming scanning stuff.

8 years agoAdd a menu option where the user can change the input resolution.
Steinar H. Gunderson [Fri, 4 Mar 2016 22:02:10 +0000 (23:02 +0100)]
Add a menu option where the user can change the input resolution.

8 years agoAdd a way to get the current video mode.
Steinar H. Gunderson [Fri, 4 Mar 2016 00:28:19 +0000 (01:28 +0100)]
Add a way to get the current video mode.

8 years agoTweak get_available_video_modes() interface.
Steinar H. Gunderson [Fri, 4 Mar 2016 00:24:10 +0000 (01:24 +0100)]
Tweak get_available_video_modes() interface.

8 years agoActually store the list of video modes.
Steinar H. Gunderson [Fri, 4 Mar 2016 00:16:16 +0000 (01:16 +0100)]
Actually store the list of video modes.

8 years agoMake drivers capable of delivering a list of modes, and setting them.
Steinar H. Gunderson [Thu, 3 Mar 2016 23:22:00 +0000 (00:22 +0100)]
Make drivers capable of delivering a list of modes, and setting them.

8 years agoNever send in a frame rate of 0/0.
Steinar H. Gunderson [Thu, 3 Mar 2016 00:48:01 +0000 (01:48 +0100)]
Never send in a frame rate of 0/0.

8 years agoPull in a bmusb bug fix.
Steinar H. Gunderson [Sun, 28 Feb 2016 17:47:19 +0000 (18:47 +0100)]
Pull in a bmusb bug fix.

8 years agoFix an off-by-one in the indexing.
Steinar H. Gunderson [Sun, 28 Feb 2016 15:50:38 +0000 (16:50 +0100)]
Fix an off-by-one in the indexing.

8 years agoAdd a simpler theme to help beginners.
Steinar H. Gunderson [Sun, 28 Feb 2016 15:47:19 +0000 (16:47 +0100)]
Add a simpler theme to help beginners.