Thursday, November 21, 2013

A quick note from The Penguin...

"Gotham will be MINE!!!!!!!!! Batkid will NEVER CATCH ME!!!!!!" Boy, was I wrong :)
Last Friday was one of the most beautiful and amazing days of my life. I played The Penguin in the SFBatKid Make-A-Wish event and it was truly an epic day. That look of sheer determination in Miles' eyes was enough to melt hearts around the world. But more on that soon.

I'm just now coming up for air after an incredibly busy few days back at work and doing lots of interviews, especially for Canadian media (being a Canadian from arguably the middle of nowhere, it was always fun hearing about something cool happening when a fellow Canadian was involved). :)

I'll post another "Summary" post soon about my thoughts on the event and how it felt to be a part of it all. More soon. I'll probably write that on the weekend once I've had a few more hrs of sleep. :)

Till then, "wahh wah wahhh!".

--The Penguin, aka, Me.

Tuesday, November 05, 2013

SF Make-A-Wish Batkid caper: Update!

WOW, this is epic.

My friend EJ kindly got me involved in the SF Bay Area's Make-A-Wish Foundation "Batkid" caper coming up on Nov 15th. This is a really incredible wish event being organized by the Bay Area Make-A-Wish Foundation. I'm so happy to be helping out, and I'll be playing a certain famous monacle-wearing villian :)

Here's a photo (courtesy of the organizers at Make-A-Wish, follow Patricia @pilarwish on Twitter) of EJ and Me getting some good exercise in an empty AT&T Park last week for the first run-through.

You'll never catch me, caped crusader!
Here are the details from Make-A-Wish if you'd like to come out and cheer on cute 5-year-old Miles ("Batkid") as he stops crime in its tracks and achieves his wish of being "Batman for a Day"!

http://sf.wish.org/news-and-events/news/wish-news/batman

It's so great to see this story traveling far and wide -- hopefully that translates into lots and lots of people coming out on Fri Nov 15th to cheer on young, brave Batkid. See the above link from Make-A-Wish to get timings of events you can come and watch throughout the day.

Here's some of the press so far:

Tuesday, October 29, 2013

iMenurkey app for Thanksgivukkah: Available NOW on the iTunes App Store

Wahoo! Our app for "Thanksgivukkah" (the mashup holiday of American Thanksgiving and Hanukkah -- one of the only times ever that these two holidays have begun on the same day) is on the iTunes App Store. Check us out here at http://imenurkey.mikejutan.com/

iMenurkey Logo
My buddy Matthew and I joined forces again and re-created our App from a few years ago (iMenorah) based on a design developed in collaboration with 9-year-old Asher Weintraub from NYC -- the genius behind the incredibly successful Kickstarter project, The Menurkey.

We are proud to announce the iMenurkey for all of your Thanksgivukkah celebration needs. Available now! http://imenurkey.mikejutan.com/

Take part in the ancient tradition of lighting the Menorah as well as celebrating this once in a lifetime event!

Gobble Gobble!

Thursday, October 24, 2013

Introducing iMenurkey

iMenurkey Logo

Introducing, the iMenurkey! A new Chanukah/Thanksgiving mash-up app from Matthew Parrott and Me.

2013 is one of the first years ever when Chanukah and American Thanksgiving collide, creating a mash-up holiday called Thanksgivukkah. We've teamed up with the people behind the Kickstarter Menurkey project to make iMenurkey.

It's not quite live on the iTunes App Store but it will be up there very soon. For now, check out the info here, and I'll post soon when it goes live.
http://www.mikejutan.com/sideprojects/imenurkey/

iMenurkey

Tuesday, October 22, 2013

San Francisco becomes Gotham City on Nov 15th

San Francisco becomes Gotham City on Nov 15th as we help young Miles achieve his Make-A-Wish and become Batman for the day. :) I will be a part of the action, and I can't wait. I'll post times and details here soon... when and where you can come, gather, and watch some epic crime-fighting in action!

http://sf.wish.org/news-and-events/news/wish-news/batman

Sunday, October 13, 2013

New OLPC page on mikejutan.com

As the OLPC-SF Summit gets closer, I wanted to make a webpage that talks about what I'm working on now and links back to the OLPC and XOFilmmaker posts on my blog.

Check it out here!
http://olpc.mikejutan.com

Good times :)

XOFilmmaker: Poster for the OLPC-SF Summit

Life has been busy lately and I haven't had a ton of time to devote to coding for my XOFilmmaker app for OLPC, but I did make some progress after getting back from Canada a few weeks ago, so that was pretty sweet.

Next week is the OLPC-SF Summit, and so I've made a poster submission for the conference to drum up some interest in my project from my fellow attendees, and also to ask around for some technical help. It'll be nice to talk to a bunch of smart people who will be able to offer some great advice, and also I hope some folks from lots of different countries around the world where I might be able to send this software to once it's complete :)


Thursday, October 03, 2013

Successful adventures in TV Cable cord cutting

One thing that seems to span cultures (at least throughout North America) is a genuine hate for cable companies. I think it's likely because we lack the general patience of yesteryear and also debugging things over the phone for those poor bastards on the other end of the line is next-to-impossible. Also, it's particularly frustrating when someone gives you the classic IT Crowd line, "Have you tried... turning it on and off again?" when you have a degree in Computer Science and you can tell that they have sent some sort of signal to your DOCSIS 3.0 modem that is overriding the router's internal default settings and you just want them to fix it. (Yep, that's why I was on the phone for 1.5 hrs on July 4th in Texas). But whatever your reason is for hating cable, I figure it's worth it if you are happy with the service you are getting.

Have you tried turning it off and on again?
Now, in my case, I use my internet like a crazy person but the TV... not so much. In fact, I've refused many epic offers of bundling and so on which will include many many epic NFL, NBA, NHL and other sports channels I am not nearly cool or jocky (or beer-fueled) enough to ever watch.

Yes, I've been in San Francisco for long enough to become a snob connoisseur of something... and that, my friends, is quality programming.

I've been treated oh-too-well with the likes of Eternal Sunshine of the Spotless Mind, TV shows like Breaking Bad (OMG THE FINALE WAS AMAZING), classics like Duck Soup and - well - anything the Coen Brothers have or will ever make. Netflix has gotten increasingly awesome over the past few years, and any binge-TV watching I am keen to binge on while recovering from the flu (just crushed the entire series of It's Always Sunny in Philadelphia) is at my fingertips. All other epic movies of consequence (or HBO shows like Curb Your Enthusiasm that are typically hard to get without cable) I can get with my Netflix Blu Ray delivery plan. And for those things that you can't wait for (yep, Breaking Bad), Amazon Instant Watch delivers the episode for $2.99 only a few hours after it airs in California -- in 1080p with 5.1 surround sound.

All of this led me to an obvious conclusion... why the hell am I still paying $25 or $30/month for basic cable? Especially when these beauties only cost $40.

RCA HDTV Antenna
I plugged this puppy in, went to tvfool.com to see where the nearest towers were and what channels I could safely expect to get, and boom! After 15 min of finding the best signal spot in my apartment, it works gloriously. I get all the basic channels in crystal-clear HD - ABC, NBC, CW, FOX, etc... basically the only things I ever watch anyway... and it costs not a penny more.

Pretty fantastic cost-cutting measure, and now I will feel more comfortable just to bank the money I save and spend it on something else, maybe upgrade my download speeds (always a possibility), or hey, maybe I'll feel more comfortable spending $4 on a new release download on Amazon Instant Watch now that I'm not shelling out cash for something I'm hardly using (and can get for free anyway).

Pretty sweet that this all worked, and it's a bit ridiculous it took me this long to switch. And hey, if the cable companies or satellite companies have something I REALLY want and I know I'll use in the future, I can always sign up again and I'm sure they'll have a sweet deal waiting for me. And if not, Netflix, Amazon Instant Watch, and just my couple of local news and main station channels will do me just fine -- plenty of excellent programming, when you want it. How quickly this world has changed in the last few years.

Monday, September 23, 2013

HDTV Antenna for free local HDTV: lets do this

Let the great cable "cord-cutting" begin!

I, like many others, have slowly grown tired of growing fees for cable companies while the service is not at all comparable to the quality, choice, and convenience of what I get from Netflix Instant Watch for $8 a month. Pair that with Netflix's Blu Ray rentals and the occasional purchase of an episode of Breaking Bad on Amazon Instant Watch, and that leaves next-to-no reason why I am still paying for cable TV.

Now of course I'd love to still get local news and my main local stations: Fox, NBC, CBS, ABC, CW. That should do it. I pay now about $30/month for basic cable, and that's all I'm getting from it anyway. Enter the amplified HDTV indoor antenna. For $40 I can plug in a flat antenna and I should, ideally, get all of these channels in crystal-clear HD for a grand total of $0 per month :) Seems like a worthy and long-overdue attempt at reducing unnecessary monthly payments on something I don't even make good use out of anyway.

I read this consumer reports review: http://www.consumerreports.org/cro/news/2013/07/indoor-hdtv-antennas/index.htm and decided to get the RCA Antenna that they suggest on there. I'll post some thoughts if this works out!

Monday, September 16, 2013

XOFilmmaker: Audio re-saving via Python

Wahoo for progress!

Tonight I just spent about an hour and a half (a short session tonight!) aiming to solve one specific problem for XOFilmmaker. Good news: problem solved!

I had taken my iPad back home to Canada a couple weeks back and read a bunch of the code for the existing OLPC Activities "Record" and "Jukebox", both of which use GStreamer a lot. This is the same library which I am employing for this XOFilmmaker activity.

Anyhow, as you might expect from previous blogposts, I've been running into a stack of problems with GStreamer and the learning curve is pretty steep, and the documentation hasn't been the most glorious. So I found some nice examples inside of these two existing activities. In Record specifically, I found a pretty fabulous function called "gst.parse_launch()" which appeared to let you just run a gstreamer command-line option directly in Python and it would "run the pipeline" for you... a GREAT way to splice together my final edits in the XOFilmmaker Activity, I reckon!

So my goal tonight was to see if I could get this to work... and the answer is... YES!!!!!!!!!


I started with the line I knew I had working last time:
gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink \
demuxer. ! queue ! theoradec ! ffmpegcolorspace ! autovideosink
This line successfully opened an ogg video file (created with the Video Camera on the XO Laptop), demuxed the audio and video, and then sent them out to an "audiosink" and "videosink" -- basically, playing the video file (with audio attached) to the screen.

On first attempt, it didn't work. It seemed like nothing was happening.

So I simplified it, reducing the line so that it worked on the command-line first, and it just outputted audio:
gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
Trying this again in Python, I still got nothing. Weird. So I tried a command-line save-to-disk operation... essentially unpacking the audio from the audio/video ogg file, and then saving the audio track only back to a new file. This was a success on the command-line:
# Audio demux, then mux again and save as a new file
gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! vorbisenc ! oggmux ! filesink location=$PWD/audioOut1.ogg
This gave me an audio file on disk that I could run.

> ogg123 audioOut1.ogg
And it worked!


Now, to convert to Python. At first I still got nothing from the pipeline and there was a file being created on disk, but it was 0 bytes. After some googling, it looked like I needed to launch the gobject MainLoop -- otherwise I wouldn't get any code launched. Duh (I guess?!) So after some digging and experimenting, I got this to work!!!!!!!

=====================================================
#!/usr/bin/python
import gobject; gobject.threads_init()
import pygst; pygst.require("0.10")
import gst

class Main:
    def __init__(self):
        '''
        # Express this gst-launch code in a Python call
        gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
          demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink \
          demuxer. ! queue ! theoradec ! ffmpegcolorspace ! autovideosink
         
          2nd try, audio only with re-convert
          gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
  demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! vorbisenc ! oggmux ! filesink location=$PWD/audioOut1.ogg
        '''  
       
        mainLoop = gobject.MainLoop(is_running=True)         
       
        filePath = "/home/mjutan/Downloads"
       
        muxline = gst.parse_launch('filesrc location=' + filePath + '/high_1.ogg' + ' ! oggdemux name=demuxer demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! vorbisenc ! oggmux ! filesink location=' + filePath + '/pythonAudioOut2.ogg')          
      
        muxline.set_state(gst.STATE_PLAYING)       
       
        while mainLoop.is_running():
            try:
                mainLoop.run()
            except KeyboardInterrupt:
                mainLoop.quit()

start=Main()
=====================================================


And here is my audio file, finally a non-zero size!

pythonAudioOut2.ogg, suckas!!!!!!!!!!!!

So why is this awesome?

The GREAT news here is that now I can work on the command-line to try to figure out how to splice Audio and Video correctly using GNonLin/GStreamer. This gst.parse_launch command removes the extra overhead of trying to set up a pipeline and catch pads and do all this other crazy crap. I just want to open up the input files, splice them together with the timings specified by the user, and output a single file all cut together correctly. It's probable that I can just programatically create a big long gst parse line which will generate a "Pipeline" for me. Then, I just run the pipeline and BOOM, the completed, edited video is written to disk. (Aside: I tried the original audio and video playback line again after I had this final version of the code with the MainLoop run() method, and that worked too, and played back my video and audio together on the screen. Awesome.)

How does this move me closer to getting video editing?

Good question. Well, it means I can now focus on getting the syntax for gst-launch correct on the command line, and try to just splice 2 videos together. If I can get this to work, then I've already solved doing the same thing from Python -- I just need to copy-paste the line into this parse_launch() command and I'm all set.

What's next?

My goal for the next OLPC session will be to try to get GStreamer on the command-line splicing 2 videos together successfully using different in and out points. If I can get that to work, then the large majority of the "unknown" section of this project will be COMPLETE!!! AHHHH man I can't wait.

From there, then I need to build a nice simple UI that kids in developing nations with next-to-no instruction about how to use this software will need to be able to understand. There will ideally be no words on the app. For this app to be a real success on the XO Laptop, my feeling is that it needs to be extremely intuitive and simple to use. Once I've got this particularly troublesome part of actually cutting videos and audio splicing together finally sorted out, then I can move onto the exciting parts of starting to build the UI and getting a playback widget figured out so kids can set the "in" and "out" points of each clip they want to use.

After that, I'll need to actually integrate it with the XO look-and-feel and with the files in the XO Journal. But that's for a later date. First I'll need to get the standalone GStreamer app working well. It's awesome to see this finally moving along though. I'm really happy with tonight's progress.

Monday, September 09, 2013

Dave Matthews Band: Shoreline: Sept 8, 2013

I've kindof lost track of how many DMB shows I've been to now... I think the grand total so far is 22 as of last night :)

It was an awesome show as usual. It's particularly amazing to witness the way that Jeff and Rawshawn (Sax and Trumpet players) mesh with the band now as compared with when they first joined-- they have always been awesome, but man the band plays together sooooo tightly now. It's pretty amazing to experience :)

Great solos, especially on Jimi Thing and Two Step. Awesome times.

Check out this set list!

1.  Louisiana Bayou
2.  Belly Belly Nice -->
3.  You Might Die Trying
4.  Proudest Monkey -->
5.  Satellite
6.  Squirm
7.  (Dont Fear) The Reaper
8.  Crush
9.  Mercy
10.  The Song That Jane Likes
11.  Warehouse  -->
12.  Typical Situation
13.  Why I Am 
14.  Snow Outside
15.  Jimi Thing
16.  Grey Street
-------- ENCORE -------- 
17.  Drunken Soldier -->
18.  Two Step

SHOW NOTES:
 --> indicates a segue into next song


Monday, August 26, 2013

XOFilmmaker: To Mux or To Demux

Whew!

Tonight I had some open time and managed to get back to my XOFilmmaker development work, which rocks.

Inspiration from Peru
I recently joined OLPC's laptop.org support mailing list and it's been super interesting to see the chatter on there. I had a conversation with a teacher out in Peru, working with kids on the XO laptops. They said they are very excited to try XOFilmmaker when it is done, and they really look forward to making movies with it!! Wow. They said they will "definitely use it" and are excited. Talk about the motivation I need to get back into the fray and bend the (increasingly complex) GStreamer library to my will! For the good of the kids, I *will* solve this!!!!!!!!

What were my goals tonight?
My goal for tonight was to jump back in whole-heartedly. I haven't had time for the past 2 months to work on this given my travel in Texas and SIGGRAPH conference talk, so I wanted to pick things up from where I left them back in June.

In June I had written some code which took in an Ogg video file filmed with an XO Laptop's webcam and then successfully spliced a portion of video A with a portion of video B, and then played that video back. Pretty good start. But, there is no audio attached, and I'm not sure why.

I have 2 goals which I was hoping to chip away at tonight, and I managed to make some progress.
  1. Figure out how to get it to play back sync'd audio along with the video.
  2. Write the file to disk, instead of play it back on screen.
So, how did it go tonight?
At first, slooooooooooowly. I ran into a lot of problems and some roads that looked promising but led nowhere.

I spent a bunch of time digging into GStreamer and GNonLin more, but kept running into more walls.

I started with the attempt to write to disk... it didn't work at first attempt, though I did get a 0-length file written to disk. So, not exactly sure how to do this, but I probably need to remove the streamer from the playback UI and just run a command which does not sync to the UI. I suspect I need a "filesink" for this, not the playback  "autovideosink". Anyway, I decided to leave this for another time and jump into figuring out the missing audio.

With every night like this, I end up pushing through the frustration of not getting anywhere and banging my head against the GStreamer API, making a few silly mistakes, and then eventually learning something and making some minor progress. Just need to keep at it and make sure I make time for lots of these evenings before the end of the year... then, just maybe, I'll be able to get this open source software out the door and into the hands of kids in Peru!

Let's look at where I started:

=======================================================
#!/usr/bin/python
import pygst
pygst.require("0.10")
import gst
import pygtk
import gtk
import gtk.glade

class Main:
    def __init__(self):

        # set up the glade file
        self.wTree = gtk.glade.XML("gnonlin.glade", "mainwindow")
       
        signals = {
            "on_play_clicked" : self.OnPlay,
            "on_stop_clicked" : self.OnStop,
            "on_quit_clicked" : self.OnQuit,
        }

        self.wTree.signal_autoconnect(signals)

        # creating the pipeline
        self.pipeline = gst.Pipeline("mypipeline")

        # creating a gnlcomposition
        self.comp = gst.element_factory_make("gnlcomposition", "mycomposition")
        self.pipeline.add(self.comp)
        self.comp.connect("pad-added", self.OnPad)

        # create an audioconvert
        self.compconvert = gst.element_factory_make("audioconvert", "compconvert")
        self.pipeline.add(self.compconvert)

        # create an alsasink
        self.sink = gst.element_factory_make("alsasink", "alsasink")
        self.pipeline.add(self.sink)
        self.compconvert.link(self.sink)
       
        # create a gnlfilesource
        self.audio1 = gst.element_factory_make("gnlfilesource", "audio1")
        self.comp.add(self.audio1)

        # set the gnlfilesource properties
        self.audio1.set_property("location", "/home/mjutan/high_1.ogg")
        self.audio1.set_property("start", 0 * gst.SECOND)
        self.audio1.set_property("duration", 5 * gst.SECOND)
        self.audio1.set_property("media-start", 0 * gst.SECOND)
        self.audio1.set_property("media-duration", 5 * gst.SECOND)

        caps = gst.Caps("audio/x-raw-float")
        self.filter = gst.element_factory_make("capsfilter", "filter")
        self.filter.set_property("caps", caps)
        self.pipeline.add(self.filter)
       
        # show the window
        self.window = self.wTree.get_widget("mainwindow")
        self.window.show_all()

    def OnPad(self, comp, pad):
        print "pad added!"
        convpad = self.compconvert.get_compatible_pad(pad, pad.get_caps())
        pad.link(convpad)

    def OnPlay(self, widget):
        print "play"
        self.pipeline.set_state(gst.STATE_PLAYING)

    def OnStop(self, widget):
        print "stop"
        self.pipeline.set_state(gst.STATE_NULL)

    def OnQuit(self, widget):
        print "quitting"
        gtk.main_quit()

start=Main()
gtk.main()

=======================================================

I spent an impressive amount of time stuck on a Python error. Whoops.

I was trying to force the "type" (or "caps") of the format to be audio/x-raw-int, trying to get the audio layer of the Ogg file extracted and get that to play back.

I should explain: Ogg is just a container. And it contains 2 pieces in my case, a "Vorbis" audio stream, and a "Theora" video stream. I've already successfully extracted the Theora video stream and can splice that together, so that rocks. But I gotta figure out what the deal is with the audio.

As you can see here, the file I recorded with the XO webcam is a combo Ogg file which contains Theora and Vorbis together.

=================================================
 [mjutan@localhost Downloads]$ ogginfo high_1.ogg
Processing file "high_1.ogg"...

New logical stream (#1, serial: 4428c820): type theora
New logical stream (#2, serial: 35df27fa): type vorbis
Vorbis headers parsed for stream 2, information follows...
Version: 0
Vendor: Xiph.Org libVorbis I 20120203 (Omnipresent)
Channels: 1
Rate: 16000

Nominal bitrate: 48.000000 kb/s
Upper bitrate not set
Lower bitrate not set
User comments section follows...
    ARTIST=Mike Jutan - San Francisco
    COMMENT=olpc
    ALBUM=olpc
    TITLE=Video by Mike Jutan - San Francisco
Theora headers parsed for stream 1, information follows...
Version: 3.2.1
Vendor: Xiph.Org libtheora 1.1 20090822 (Thusnelda)
Width: 400
Height: 300
Total image: 400 by 304, crop offset (0, 4)
Framerate 10/1 (10.00 fps)
Pixel aspect ratio 1:1 (1.000000:1)
Frame aspect 4:3
Colourspace unspecified
Pixel format 4:2:0
Target bitrate: 0 kbps
Nominal quality setting (0-63): 16
Vorbis stream 2:
    Total data length: 23413 bytes
    Playback length: 0m:05.767s
    Average bitrate: 32.472954 kb/s
Logical stream 2 ended
Theora stream 1:
    Total data length: 31776 bytes
    Playback length: 0m:05.900s
    Average bitrate: 43.086102 kb/s
Logical stream 1 ended
=================================================
Ok so where next. I got caught up on the syntax for the "Caps", trying to supply a similar arrangement to this code below in Python which did not work at all.

There is a command-line version of GStreamer that you can access with gst-launch and that allows you to sort-of "prototype" out a streamer Pipeline on the command-line to see if it works before then trying to integrate it into Python. So that's pretty cool.

Problem is, I was getting supppper weird results from this below. This was telling me that GStreamer was missing some plugins which turned out to be a pretty awesome red herring/wild goose chase.

I also was silly and tried to set a caps value on something using this format:
self.audio1.set_property("caps", "audio/x-vorbis")

And I got a pretty clear TypeError from Python. I was so confused though that I went on a search trying to figure out what I was doing wrong. As it turns out, it was a simple type error and you need to create a Caps object, like this:
        caps = gst.Caps("audio/x-raw-float")
        self.filter = gst.element_factory_make("capsfilter", "filter")
        self.filter.set_property("caps", caps)

But,  as it turns out, I may not even need that. D'oh.

Anyhow, this took me on a trip to attempt to install all the other gstreamer plugins, consider building gst-plugins-base myself, and a bunch of other things that didn't work. All because of this weird message about missing plugins.

=================================================
gst-launch gnlfilesource name=video location=$PWD/high_1.ogg \
start=0 duration=5000000000 \
media-start=0 media-duration=5000000000 \
! identity single-segment=true ! progressreport update-freq=1 ! ffmpegcolorspace \
! theoraenc ! oggmux name=mux ! filesink location=$PWD/outputResult.ogg \
gnlfilesource name=audio caps="audio/x-raw-int" location=$PWD/high_1.ogg \
start=0 duration=5000000000 \
media-start=0 media-duration=5000000000 \
! identity single-segment=true ! audioconvert ! vorbisenc ! mux.

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GnlFileSource:audio/GstURIDecodeBin:internal-uridecodebin/GstDecodeBin2:decodebin20: Your GStreamer installation is missing a plug-in.
Additional debug info:
gstdecodebin2.c(3576): gst_decode_bin_expose (): /GstPipeline:pipeline0/GnlFileSource:audio/GstURIDecodeBin:internal-uridecodebin/GstDecodeBin2:decodebin20:
no suitable plugins found
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
=================================================


Bah. So anyway after that, I then managed to get through the Python errors and then ended up with this pretty hard-to-understand error. It's basically saying that my audioconvert module is failing and that sortof implied again that maybe I was missing a plugin. Hmm...

 =================================================
** Message: pygobject_register_sinkfunc is deprecated (GstObject)
play
pad added!
Traceback (most recent call last):
  File "gnonlin-tutorial1.py", line 64, in OnPad
    pad.link(convpad)
TypeError: GstPad.link() argument 1 must be gst.Pad, not None
stop
quitting
 =================================================

After more searching I finally came across this useful line. And enter the magical demuxer....

 =================================================
gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
  demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink \
  demuxer. ! queue ! theoradec ! ffmpegcolorspace ! autovideosink
=================================================

I ran this line and... voila!!!!!!!! My video clip played in a viewer, WITH AUDIO!!! Huzzahh!!

So this is great news. I suspect the problem turned out to be that really I just need to essentially "unpack" the Vorbis audio file from the OGG container... I can't just "read the audio portion" from the Ogg file... though that seemed to work fine with the video portion. I guess I actually need to "demux" the Ogg file first, essentially unpacking it into it's audio and video portions. From there, I should hopefully be able to then compile up the start and end time segments that I want, and then re-compile them into a new Ogg file ("muxing them") and save that out to a filesink on disk. And of course, I'll need to do that in Python.

So after a lot of tripping over the wrong things, I feel like I managed to make some progress. The issue with my specific file is likely that I need to demux it first or something like that. I just tried an initial version of this in Python and I don't get any audio playing... but at least there are no failures.

One other odd thing in that this seems to work ok with the filesrc object. But I need to use the "gnlfilesource" object so I can splice it. That seems to hang up the pipeline for who knows what reason...
gst-launch gnlfilesource location=$PWD/high_1.ogg start=0 duration=5000 \
  media-start=0 media-duration=5000 ! oggdemux name="demuxer" \
  demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...

Maybe you have to have a  gnlcomposition for this to work. Anyway, I should go to bed. 3am on a "school" night :)

Something to try to continue another night. Off to bed to dream of video editing in developing nations.

Mike :)

Saturday, August 24, 2013

Introducing, the Menurkey

This is hilarious and awesome.

The Menurkey!

This year, the Jewish celebration of Chanukah and the American tradition of Thanksgiving land on the same day for the first time ever. There is this hilarious video, a song that goes with it, and an opportunity to actually order a 3D Menurkey Menorah for your very own, via their Kickstarter project.

Check it out!!!
http://kck.st/1d2vZrq

The 9-year-old inventor of the Menurkey (and his creative parents) reached out to Matt and Me, and we will be partnering with them to make a special version of iMenorah for this year. We'll announce that when it's ready sometime in October. But right now you can order your very own real-life Menurkey via the Kickstarter link :)




Wednesday, August 21, 2013

Final Texas Journal post: Links to all blog posts

Thanks for your interest in my Texas blog! Here is the entire trip journal, in order of posting.

Mike Jutan's 2013 Texas Journal

Texas 2013 Day 11: Wrap up

7/8/2013
Texas 2013 Day 11: Wrap up

Howdy!
And... here we are. What an awesome trip. It went by SO fast! Everyone had a great time and it was a huge success.

For the last day in Texas, we started by cleaning the lake house and packing up all of our stuff so we could chill out and enjoy the day. After prepping everything and heading back to Buc-ee's to get some more beef jerky for me to take home, and going to H.E.B. so I could buy some of their amazing coffee to take home... we got everything ready to go and then headed to the Dry Comal Creek winery.

Dry Comal Creek winery
It was great to actually have a chance to go there as we were worried about potentially missing it. The tasting was great and I really liked the White Black Spanish wine I'd already bought. The had a great French Colombard which she called a "front porch wine" which is exactly the kind I like. :) It said "Demi-Sweet" but it was pretty sweet, just not over-the-top. Great stuff. Their Sangria was also amazing and I got an extra glass of that.

Then we headed to Frank's parents' place to chill out and enjoy ourselves before heading out for the drive back to Austin to the airport. We took a little break out at a funny outdoor furniture store, which had some funny stuff.

Outdoor furniture craziness
Rawrrrr!!
USA
We then spent the rest of the afternoon and evening at Frank's parents' place. It was great to chat and enjoy their company some more, and also play with the cats. I was particularly excited to see sweet Gracie again because he was so sweet and rolled around a lot outside while I was petting him. He is an amazing and awesome cat.

We had some great food for dinner and Frank's parents as always made us feel so happy and welcome and comfortable. It was a real pleasure to get to spend so much time with them and to be welcomed into their home with such open arms. What a great time! We enjoyed it there and chatted for a few hours before heading back to get our stuff and off to the airport in Austin.

Here are a few photos of the cool souveniers that I took back to San Francisco.

Awesome ceramic bird I bought
Bright shoes from the Adidas outlet
Hilarious socks I got at Buc-ee's... seems like they should almost be Canadian. A moose with a beer and a beaver in a life jacket?!
The beaver in the speedo is hilarious
Iced Tea tea bags and Pecan Pralines to take into work
My awesome belt, steer buckle, and extra buckle
My boots!
Oh these boots are so awesome
Don't mess with it
Spicy Jams
Franklin BBQ sauce
Whiskey and Wine
Amazing coffee from H.E.B.
Flavoured salt, Texas keychain and Mango tea from Jess's family
What a great time we had in Texas. I was so happy that Frank and Jess invited us to come see life as they lived it as children. It was really cool to see some of the places that Jake and my other Texan friends have talked about and to experience the culture for myself. As usual, that's the part I find the most interesting.

Also, WOW. That Franklin BBQ brisket was REALLY good.

Y'all like it? Y'ount'to go to Texas someday too?
-Mike Jutan
July 2013

Texas 2013 Day 10: Franklin BBQ

7/7/2013
Texas 2013 Day 10: Franklin BBQ

Heeeerrre we gooooo!!!!!!!!!!

We got up SUPER early today to drive from New Braunfels to Austin, just to get in line for 3+ hours for BBQ. But not just any BBQ... the place defined as "one of the 10 most important restaurants in the US" and consistenly voted the top BBQ in Texas since they opened. They have sold out of their food on EVERY SINGLE DAY OF OPERATION. Think about that for a second. They have NEVER *NOT* SOLD OUT of all of their food on any day they are open. Amazing.

So you can imagine our excitement this morning.

8:20am, Austin. Let's do this.
A nice message while we wait in the sunshine
Franklin BBQ, you epic place
The line gets longer and longer

We got in line at 8:20 and we were far from the first people there. There were perhaps 30 or 40 people ahead of us already, which had us a little worried that we might not get any brisket... but thankfully it all worked out. Fortunately they are super organized and they have a guy walk down the line and take your orders and give you any warnings of food that might be out by the time you get in. Eventually, the line actually gets cut off so that people don't wait forever and end up with no food. Franklin BBQ opens at 11am, and it was already getting hot at 8:20.

Susie kindly showed up to bring us coffee and doughnuts, what a champion. Michal and I at one point were so hot we headed to the CVS around the corner to get some water. Whew!! But with lots of drinking of water and lots of staying in the shade, we were all good and still excited when 11:30am rolled around and we got to go inside into the glorious A/C.

Susie brought us doughnuts!
Chillin' out in line
And the line gets longer!
11:30am: We're in!

We waited in line for about 30 min inside and all bought T-Shirts to commemorate what was going to be the tastiest brisket of all time. We got up to the front and got to watch the owner of the place in awe while he worked his magic.



We really wanted to try the turkey as well, but the lady in front of us ordered the entire thing for her son's birthday party. Nooooo!!! That was too bad and the owner must have overheard us. He sliced off a small piece for us to taste... what a nice guy. Excited about my new shirt (and trying not to get BBQ sauce on it), I ordered exactly what Anthony Bourdain ordered when he was there: 1lb brisket - 1/2 lean, 1/2 fatty. No nonsense stuff like sides or extras. Just straight amazing brisket.

Here's the man himself, slicing some brisket for us!
Ohhhhhhhhhhh so good
Check out the "smoke ring" on this brisket
SO PSYCHED
This was amazing
They had free pickles and also they gave us some plain white bread to dip in the sauce. The sauces were fantastic, and the Espresso one was my favourite. Glad I have the bottled versions of those to take home to California with me! I did also get a small Banana Bourbon pie to take away for dessert later.

The food was absolutely phenomenal. The brisket was exceptionally soft and tasty, the smoke flavour was just permeating perfectly through the meat, and the fatty and lean versions of the brisket were both excellent. The lean one was a little easier to just eat the whole piece at once, while the fatty one was a little juicier (just a little bit) but you had to eat around the fat. This was literally the best brisket I've ever had. It was insanely amazing.

After a truly stellar meal of 1lb meat only and nothing else, it was time for a break in the park. We headed to sit by the water and relaxed and digested our massive meal. It was nice to walk around a bit there and to just enjoy Austin after such an epic food experience.

From the park, we headed to the UT area and went to a coffee shop where I bought a Freddo, which is something like my favourite Cafe Shakkerato! That was really good. We then headed down to do some random shopping and I saw a "Keep Austin Weird" t-shirt. I also saw those hilariously small Texas flag shorts that girls wear for July 4th, and joked about buying them for myself.

Out for a drink
From there we went to the Driskill Hotel to look around the lobby and also to get a drink and chill out from the heat outside. This was fun and a relaxing break after so many hours outside again today. There was a possibility of a cool bat show in the evening, but we were all so tired that we headed back to the lake house instead. When we got there we were so tired from the day that we just stayed in for the rest of the evening and chilled out. What an amazing day!!

Texas 2013 Day 9: Tubing and Cowboy Boots

7/6/2013
Texas 2013 Day 9: Tubing and Cowboy Boots

Tubing today!! This was another big reason for the trip to Texas -- Frank and Jess had told me all these great stories of "Tubing on the Guadalupe" and I was really keen to take part in this honoured pasttime from their childhood summers.

We headed off a little later than usual and stopped first at Buc-ee's for breakfast food and extra drinks. Then off we went to Gruene to "put in" at Rockin R rentals. They were very organized, we paid for the tubes and dropped off anything we didn't need for the trip, tied the drinks onto the tubes and tied on a garbage bag, and off we went!

Tubing
Tubing
Tubing
It was really fun. Most of it was quite slow, very much like a lazy river. There were lots of people out there, having fun and just taking it easy. There were some nice views along the way of cool lakeside properties, and we chatted along the way about which ones we liked the best -- Frank getting to geek out about his architecture knowledge as well.

After about 2.5 hrs, we got out and were driven back to the first spot. We changed back into our shorts and headed for the outlet malls! First we went back to the boot place and they had all the boots out at this point and organized into their appropriate size areas, and separated out male vs. female. They had done a lot of work to get organized in the last few days! I tried on LOTS. I tried on a size 9 square toe and it fit fine, but I preferred a rounded or pointed toe because it looked so much more like a cowboy boot. Rounded was the best though. I tried the different widths too: B, D, EE... and it turned out that 9.5 D was my best fit. I liked a plain brown one, but after trying it on it was a bit too plain. I tried on a few others that looked too ornate on the toe and looked too girly. Then I tried a brown one with nice stitching work, but it was too tight on the toe which would be an issue later.

My boots!!!!
My epic boot purchase
The best fit after trying on about 15 boots was a Cherry Black goat and lizard boot! I really liked it and though the lizard part is a bit unusual, it's also pretty subdued and not in-your-face like the alligator ones, so I like it. It's a great fit and looks great with jeans. It's also super funny to be getting these, but Frank and Michal and Jess all approve so it's go time! Apparently I shouldn't wear these with shorts unless I am a girl, so that's too bad. I'll need to invest in some boot cut jeans I guess. I bought them and I'm so excited as to how they will look with a suit and with my regular jeans too. They were a super good deal too. The regular price on these, since they have "exotic leather" is about $540, and I got them for $299! A great deal given how much cowboy boots tend to cost, and this brand (Lucchese) are some of the best.

Awesome Texas whiskey and wine I got
The boot outlet appeared to be a new business venture for the owners of the next-door Gabriel's Liquor Warehouse! So we went in there as well, and I got some wine from Dry Comal Creek winery in case we don't get there before we leave. I also got a great Texas whiskey called Rebecca Creek, which we had tried at the rodeo earlier in the trip.

From there, we headed out for dinner and to go meet Alex and Tammy and their baby!! It's so nice that they made the trip. We headed to Root Cellar Cafe, and they had great food. We started with spinach artichoke dip and bruschetta. We also got beer bread with honey butter which was excellent. I got a Pecan-Bourbon chicken salad with fried zucchini sticks, and Michal got a salmon and salad which was also excellent. The food was fantastic and it was awesome to have time to catch up with Tammy and Alex... they are so cool. :)

Salmon for dinner
Fried asparagus!
Frank very seriously cutting his burger
Jess and some leafy green salad situation
Good times!
Tammy and little Mr. Texan!
After this tasty dinner and good chat, we headed back to the lake house. Frank's parents arrived and we chatted and unpacked and showed off our boot purchases. We had an ice cream snack and I caught up on my journal, heading to bed thinking about how glorious Franklin BBQ in Austin will be tomorrow.