Skip to content

DEV NOTES

bill auger edited this page Nov 15, 2015 · 25 revisions

###DONE: build and package for 32-bit debian

  • factored fpm command out of .travis.yml into Builds/fpm-build.sh
  • build and package 32-bit artifact for debian
  • added Builds/arch/PKGBUILD
  • moved Builds/LinuxMakefile/debian to Builds/debian
  • added Builds/debian/push-package.sh

implement interstitial source

  • allows bypassing of screencap and/or camera
  • factored gStreamer functinoality out of AvCaster class and into new Gstreamer class
  • renamed AvCaster::InitGstreamer() to Gstremer::Initialize()
  • renamed AvCaster::SetGstreamerState() to Gstremer::SetState()
  • added Gstreamer::InterstitialBin and Gstreamer::ConfigureInterstitial() (snow only)
  • added Gstreamer::AddBin() Gstreamer::RemoveBin() Gstreamer::IsInPipeline() helpers

redesign GUI and refactor storage

  • added Preview GUI
  • moved Config::setConfig() to AvCaster::SetConfig()
  • added AvCaster::ToggleOutput(), AvCaster::TogglePreview(), AvCaster::ToggleScreencap(), AvCaster::ToggleCamera(), AvCaster::ToggleText(), AvCaster::ToggleConfig(), AvCaster::TogglePreview()
  • added AvCasterConfig->setCurrentConfig() and MainContent->reloadConfig()
  • refactored config store into list of semi-static presets and one analogous volatile config
  • changed semantics of AvCasterConfig->configStore from root node to volatile GUI config
  • added AvCasterConfig->configRoot and AvCasterConfig->configPresets
  • added AvCasterConfig::validatePreset()
  • added AvCasterConfig->validateRootProperty(), AvCasterConfig->validatePresetProperty(), AvCasterConfig->sanitizeRootComboProperty(), AvCasterConfig->sanitizePresetComboProperty() helpers
  • added AvCasterConfig::presetNames() and AvCaster::PresetNames()
  • added AvCasterConfig::storePreset() and AvCaster::StorePreset()
  • added AvCasterConfig::deletePreset() and AvCaster::DeletePreset()
  • added Gstreamer::Configure() (currently noop)

implement config presets (closes #20)

  • added PresetSeed class for creating default static presets via PresetSeed::NewPreset()
  • Config GUI reloads each time brought to front
  • consolidated Config::populateComboboxes() into Config::loadConfig()
  • consolidated Gstreamer::Configure* methods into Gstreamer::ConfigureTodo()
  • removed model handles fropm Config and Controls GUI classes in favor of controller getters/setters
  • added AvCaster::GetConfigStore(), AvCaster::GetPresetIdx(), AvCaster::GetIsConfigPending(), AvCaster::GetPresetName(), AvCaster::GetPresetsNames(), AvCaster::GetCameraNames(), AvCaster::GetAudioNames(), AvCaster::GetCameraConfig(), AvCaster::GetCameraResolutions(), AvCaster::GetCameraResolution(), AvCaster::GetCameraPath(), AvCaster::GetCameraRate()
  • added AvCaster::StorePreset(), AvCaster::RenamePreset(), AvCaster::DeletePreset(), AvCasterStore::storePreset(), AvCasterStore::renamePreset(), AvCasterStore::deletePreset()
  • added AvCasterStore::loadPreset(), AvCasterStore::presetsNames(), AvCasterStore::cameraNames(), AvCasterStore::audioNames(), AvCasterStore::getCameraConfig(), AvCasterStore::getCameraResolutions()
  • added Controls::rejectPresetChange(), Controls::setCreatePresetMode(), Controls::isCreatePresetMode()
  • added Config::configureSlider(), Config::configureTextEditor(), Config::configureCombobox(), Config::enableComponents()
  • added Controls::configureCombobox(), Controls::handleSaveButton(), Controls::handleNewButton(), Controls::handleDeleteButton(), Controls::handlePresetCombo(), Controls::toggleControls(), Controls::loadConfig(), Controls::rejectPresetChange()
  • added AvCaster::IsEnvironmentSane(), AvCaster::IsMutablePreset()
  • renamed AvCaster::ToggleConfig() to AvCaster::RefreshGui()

handle command line arguments

  • renamed AvCaster::IsEnvironmentSane() to AvCaster::ValidateEnvironment()
  • added AvCaster::HandleCliParams()
  • renamed AvCasterStore->createPresets() to AvCasterStore->verifyPresets()
  • refactored PresetSeed class

###CURRENT: allow toggle devices, preview, and output via GUI (issue #21)

refactor Gstreamer class to be more modular

  • Gstreamer Bins provide their own fake sources/sinks when disabled
  • removed input tees, queues, and sinks from CompositorBin
  • CompositeSink is now much larger single preview
  • toggle devices, preview, and output via GUI requires restart (issue #21)
  • added Gstreamer::MakeLctvUrl(), Gstreamer::MakeVideoCapsString()
  • removed Gstreamer::FullscreenSink, Gstreamer::OverlaySink, Gstreamer::CompositeSink
  • added Gstreamer::WindowHandle
  • removed Gstreamer::MakeRequestSrcPad(), Gstreamer::MakeRequestSinkPad(), Gstreamer::MakeRequestGhostPad()
  • removed AvCaster::ToggleOutput(), AvCaster::ToggleInterstitial(), AvCaster::ToggleScreencap(), AvCaster::ToggleCamera(), AvCaster::ToggleText(), AvCaster::TogglePreview()
  • added Gstreamer::ReconfigureOutput(), Gstreamer::ReconfigureInterstitial(), Gstreamer::ReconfigureScreencap() Gstreamer::ReconfigureCamera(), Gstreamer::ReconfigureText(), Gstreamer::ReconfigurePreview()
  • renamed Config->outputStreamCombo() to Config->outputSinkCombo()
  • renamed PresetSeed->containerIdx to PresetSeed->muxerIdx and PresetSeed->streamIdx to PresetSeed->sinkIdx
  • removed Gstreamer::TogglePreview(), removed Gstreamer::ToggleOutput()
  • added Gstreamer::NewPipeline(), Gstreamer::NewBin()
  • renamed Gstreamer::MakeElement(), Gstreamer::MakeCaps() to Gstreamer::NewElement(), Gstreamer::NewCaps()
  • renamed Gstreamer::MakeGhostSrcPad(), Gstreamer::MakeGhostSinkPad(), Gstreamer::MakeGhostPad() to Gstreamer::NewGhostSrcPad(), Gstreamer::NewGhostSinkPad(), Gstreamer::NewGhostPad()

initialize media pipeline per initial control toggle buttons

  • removed Gstreamer::ConfigureTodo()
  • renamed Gstreamer::Configure() to Gstreamer::ConfigurePipeline()
  • detached presets from main store until marshalled to disk
  • added Gstreamer::IsPlaying(), Gstreamer::IsInPipeline()
  • added AvCasterStore->toogleControl()
  • factored out the remaining gStreamer C lib calls into wrappers
  • added Gstreamer::NewPipeline(), Gstreamer::NewBin(), Gstreamer::RecreateBin()
  • consolidated explicit caps strings Gstreamer::Make*CapsString()
  • added Gstreamer::MakeVideoCapsString(), Gstreamer::MakeScreenCapsString(), Gstreamer::MakeCameraCapsString(), Gstreamer::MakeAudioCapsString(), Gstreamer::MakeH264CapsString(), Gstreamer::MakeMp3CapsString()
  • all bins now are capable of linking themselves to other bins on re-configure
  • consolidated Gstreamer::ReconfigureOutput(), Gstreamer::ReconfigureInterstitial(), Gstreamer::ReconfigureScreencap() Gstreamer::ReconfigureCamera(), Gstreamer::ReconfigureText(), Gstreamer::ReconfigurePreview() into Gstreamer::Reconfigure()
  • renamed all Gstreamer::AddGhostPad() to Gstreamer::NewGhostPad()
  • added Gstreamer::DestroyBin() (may remove in favor of disabled Gstreamer::ReconfigureBin())

toggle preview and output at runtime per control buttons

  • all positioning except for the gstreamer overlay is now done by the jucey bits
  • added MainContent class to jucer project and removed most positioning constants
  • added Preview GUI class
  • added bulid helper scripts to repo at Build/Scripts
  • added AvCaster::GuiChanged()
  • added AvCasterStore->getKeyNode(), AvCasterStore->isControlKey(), AvCasterStore->listen()
  • added Gstreamer::IsInitialized()
  • added MainContent::getPreviewBounds() and AvCaster::GetPreviewBounds()
  • added AvCaster::SetStatusL()
  • added Gstreamer::ConfigureCaps() , Gstreamer::ConfigureQueue() , Gstreamer::ConfigureScreen(), Gstreamer::ConfigureCamera(), Gstreamer::ConfigureFauxVideo(), Gstreamer::ConfigureText(), Gstreamer::ConfigureFile(), Gstreamer::ConfigureCompositor(), Gstreamer::ConfigureCompositorSink(), Gstreamer::ConfigureFauxAudio(), Gstreamer::ConfigureX264Encoder(), Gstreamer::ConfigureLameEncoder(), Gstreamer::ConfigureFlvmux()

housekeeping

  • updated CodeBlocksLinux project
  • updated changelog, version numbers, and READMEs
  • added Builds/Scripts/cppcheck-filtered.sh
  • addresssed some lint issues
  • added AvCaster::SetWindowTitle()
  • removed MainContent::instantiate(), MainContent::setTitle()
  • removed AvCasterApplication param from MainWindow constructor
  • removed MainWindow param from MainContent constructor

###TODO re-configure media pipeline at runtime per control toggle buttons implement interstitial replace testvideos with alpha img or fakesrc

  • verify the runtime dependencies
  • connect remaining config GUI controls
  • sanity checks/validations
  • test for device/screen existence
  • detect camera resolutions and implement device storage (moving CAMERA_RES_ID out of main store)
  • GUI styling
  • GUI tooltips
  • translations
  • scale inputs to fill compositor output

TODO: after JUCE upgrade

  • change listeners of old form SliderListener to new form Slider::Listener

// useful snippets GstElement* GetElement(GstBin* a_bin , String element_id) { return gst_bin_get_by_name(a_bin , CHARSTAR(element_id)) ; }

git add Source/ && git add Builds/ && git add AvCaster.jucer && git add .travis.yml git s | grep -v JuceLibraryCode git co HEAD JuceLibraryCode && rm JuceLibraryCode/modules/juce_core/native/juce_curl_Network.cpp JuceLibraryCode/modules/juce_core/text/juce_Base64.cpp JuceLibraryCode/modules/juce_core/text/juce_Base64.h JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h git add Builds/GnuMakefile/Makefile AvCaster.jucer Builds/GnuMakefile/Makefile Builds/MacOSX/AvCaster.xcodeproj/project.pbxproj Builds/MacOSX/Info.plist Builds/VisualStudio2008/AvCaster.vcproj Builds/VisualStudio2008/resources.rc Builds/VisualStudio2015/AvCaster.vcxproj Builds/VisualStudio2015/AvCaster.vcxproj.filters Builds/VisualStudio2015/resources.rc Source/AvCaster.cpp Source/AvCasterConfig.h Source/Config.cpp Source/Config.h Source/Trace/TraceAvCaster.h

$(if $(filter-out x86_64 , $(shell uname -m)) , -malign-double , -fPIC) (after upgrade) $ CONFIG=Release32 PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/ make

// debootstrap sudo apt-get install debootstrap schroot sudo echo " [stable-i386] description=Debian stable (i386) directory=/srv/chroot/stable_i386 personality=linux32 root-users=travis type=directory users=travis " >> /etc/schroot/schroot.conf sudo debootstrap --variant=buildd --arch i386 stable /srv/chroot/stable_i386 http://ftp.de.debian.org/debian/ schroot -c stable-i386 -u root apt-get install -y --force-yes apt-get install libfreetype6-dev libgstreamer-plugins-base1.0-dev libx11-dev libxcursor-dev libxinerama-dev schroot -c stable-i386

// orphaned refs

  • 55707f2 2015-10-22 | release build (HEAD -> rebase, origin/gstreamer, gstreamer) [bill auger]
  • 887ae62 2015-10-22 | start all cameras without specifying caps (origin/travis, origin/master, origin/HEAD, travis, master) [bill auger]
  • bdabf7d 2015-10-21 | add .travis.yml [bill auger]
  • 3b2e26d 2015-10-16 | implement video tees (closes #12) (closes #18) [bill auger]
  • fdb42db 2015-10-15 | Update README.md [bill auger]

###some usefulk links
https://packages.qa.debian.org/g/gstreamermm-1.0.html
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideooverlay.html

###WARNINGS: v4l2bufferpool libv4l2 converter detected, disabling CREATE_BUFS

###NOTES: currently locked at 3.1.1 because of scaled resolutions bug

screen+camera+audio->comp+tees->fake fake->enc->mux->output gstreamer HEAD behaviour

define CONFIGURE_SCREENCAP_CHAIN 1

define CONFIGURE_CAMERA_CHAIN 1

define CONFIGURE_AUDIO_CHAIN 1

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN 1

define CONFIGURE_MUX_CHAIN 1

define CONFIGURE_OUTPUT_CHAIN 1

define CONFIGURE_TEES 0|1

define FAUX_SCREEN_SRC 0

define FAUX_CAMERA_SRC 0

define FAUX_AUDIO_SRC 0

define FAKE_MUX_ENCODER_SRC_AND_SINK 1

screen+camera+audio->comp->enc->mux->output master HEAD behaviour

define CONFIGURE_SCREENCAP_CHAIN 1

define CONFIGURE_CAMERA_CHAIN 1

define CONFIGURE_AUDIO_CHAIN 1

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN 1

define CONFIGURE_MUX_CHAIN 1

define CONFIGURE_OUTPUT_CHAIN 1

define CONFIGURE_TEES 0

define FAUX_SCREEN_SRC 0

define FAUX_CAMERA_SRC 0

define FAUX_AUDIO_SRC 0

define FAKE_MUX_ENCODER_SRC_AND_SINK 0

screen+camera+comp+tees

define CONFIGURE_SCREENCAP_CHAIN 1

define CONFIGURE_CAMERA_CHAIN 1

define CONFIGURE_AUDIO_CHAIN 0

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN 1

define CONFIGURE_MUX_CHAIN n/a

define CONFIGURE_OUTPUT_CHAIN n/a

define CONFIGURE_TEES 0|1

define FAUX_SCREEN_SRC 0

define FAUX_CAMERA_SRC 0

define FAUX_AUDIO_SRC 0

define FAKE_MUX_ENCODER_SRC_AND_SINK n/a

screen+audio->enc->mux->output

define CONFIGURE_SCREENCAP_CHAIN 1

define CONFIGURE_CAMERA_CHAIN 0

define CONFIGURE_AUDIO_CHAIN 1

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN n/a

define CONFIGURE_MUX_CHAIN 1

define CONFIGURE_OUTPUT_CHAIN 1

define CONFIGURE_TEES n/a

define FAUX_SCREEN_SRC 0

define FAUX_CAMERA_SRC 0

define FAUX_AUDIO_SRC 0

define FAKE_MUX_ENCODER_SRC_AND_SINK 0|1

camera+audio->enc->mux->output

define CONFIGURE_SCREENCAP_CHAIN 0

define CONFIGURE_CAMERA_CHAIN 1

define CONFIGURE_AUDIO_CHAIN 1

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN n/a

define CONFIGURE_MUX_CHAIN 1

define CONFIGURE_OUTPUT_CHAIN 1

define CONFIGURE_TEES n/a

define FAUX_SCREEN_SRC 0

define FAUX_CAMERA_SRC 0

define FAUX_AUDIO_SRC 0

define FAKE_MUX_ENCODER_SRC_AND_SINK 0|1

fakescreen+fakecamera->comp

define CONFIGURE_SCREENCAP_CHAIN 1

define CONFIGURE_CAMERA_CHAIN 1

define CONFIGURE_AUDIO_CHAIN 0

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN 1

define CONFIGURE_MUX_CHAIN n/a

define CONFIGURE_OUTPUT_CHAIN n/a

define CONFIGURE_TEES 1

define FAUX_SCREEN_SRC 1

define FAUX_CAMERA_SRC 1

define FAUX_AUDIO_SRC 0

define FAKE_MUX_ENCODER_SRC_AND_SINK 0|1

fakescreen+fakecamera+fakeaudio->comp->tees->fake fake->enc->mux->output

define CONFIGURE_SCREENCAP_CHAIN 1

define CONFIGURE_CAMERA_CHAIN 1

define CONFIGURE_AUDIO_CHAIN 1

define CONFIGURE_TEXT_CHAIN 0

define CONFIGURE_COMPOSITING_CHAIN 1

define CONFIGURE_MUX_CHAIN 1

define CONFIGURE_OUTPUT_CHAIN 0|1

define CONFIGURE_TEES 1

define FAUX_SCREEN_SRC 1

define FAUX_CAMERA_SRC 1

define FAUX_AUDIO_SRC 1

define FAKE_MUX_ENCODER_SRC_AND_SINK 1

arch package

https://gist.github.com/0c69dd2072891af0e06f.git names

freeglut3-dev           =       freeglut
g++                                                    
libasound2-dev          =       alsa-lib                        1.0.29-1
libcurl4-openssl-dev    =       curl                            7.45.0-1
libfreetype6-dev        =       freetype2                       2.6.1-1
libjack-jackd2-dev
libx11-dev              =       libx11                          1.6.3-1
libxcomposite-dev       =       libxcomposite                   0.4.4-2
libxcursor-dev          =       libxcursor                      1.1.14-2
libxinerama-dev                 libxinerama                     1.1.3-2
libxrandr-dev           =       libxrandr / libxrandr-git       1.5.0-1
mesa-common-dev         =       mesa                            11.0.3-1

arch additional reqs  
libgstopencv.so  
libgstopenal.so

####detect camera resolutions

$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 160x120
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.100s (10.000 fps)
 
        Index       : 1
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 160x120
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)

or:

#include <sys/ioctl.h>
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
struct v4l2_fmtdesc fmt;
struct v4l2_frmsizeenum frmsize;
struct v4l2_frmivalenum frmival;

fmt.index = 0;
fmt.type = type;
while (ioctl(fd, VIDIOC_ENUM_FMT, &fmt) >= 0)
{
  frmsize.pixel_format = fmt.pixelformat;
  frmsize.index = 0;
  while (ioctl(fd , VIDIOC_ENUM_FRAMESIZES, &frmsize) >= 0)
  {
    if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE)
      printf("%dx%d\n" , frmsize.discrete.width , frmsize.discrete.height) ;
    else if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE)
      printf("%dx%d\n" , frmsize.stepwise.max_width , frmsize.stepwise.max_height) ;
    frmsize.index++;
  }
  ++fmt.index ;
}
Clone this wiki locally