Posts
One Step Forward, Two Steps Back!
The development of my app hit a roadblock yesterday. Effect selection works! Record/Pause/Resume works! It’s all super slick! And it CRASHES!!!
I’m not entirely sure what it is, but it’s either a Threading/Memory-Management issue with the GPUImage library, or an issue in the driver software for the GPU itself. I am thinking it might be a driver issue as well because, I simply created and deleted a bunch of frame buffers, and render buffers using the standard GL functions… and eventually ended up getting a system memory warning. As for GPUImage, there’s some timing issues in there, where it tries to process a frame after it’s buffer had been cleared and deallocated… and ends up with a seg fault (EXC_BAD_ACCESS).
So, when I try to re-route the video preview from the Effect Selection screen, to the Recording Preview screen… the App crashes! Well, I’m not gonna spend time debugging the issue in the GPUImage framework, or the OpenGL drivers. The app got more stable when I decreased the number of active video previews on the effect selection screen. So, there’s definitely a threading issue somewhere, and debugging those are hard… especially when it’s in a codebase written by someone else, with almost zero documentation.
Instead, I’m gonna try and re-use UI elements and simply move the pre-wired preview elements in the view hierarchy. GPUImage’s OpenGL buffers are backed by UIKit Core Animation Layers, and as long as I don’t resize an existing UIView, its buffers aren’t affected. One caveat to this approach… It limits what I can do with the UI. Especially since I can’t re-size them without risking a crash. A slight re-design is in order.
I originally planned on getting the basic app hooked up by tonight, before I go camping/hiking for the weekend. But, that doesn’t seem likely. Now, I don’t expect to have a beta build out anytime before monday, and it probably wont include the UI for effect customization :( At least, I have a workaround in mind, and it actually made me rethink the UI and made the overall experience come together in a better way. Hopefully it works!
recording ui work in progress heres a preview
Recording UI… Work In Progress.
Here’s a preview of the work I’ve been putting into graphic design for UI elements. There’s the Back button, Record button, and the Effect Settings button. Hopefully, those were obvious… If not, let me know in the comments about what didn’t make sense.
Film Noir
So, I finally got an official job offer from Shutterfly, and will be joining them soon, starting on the 17th of June :) Until then, I’ve got all engines rolling full-steam on my video app! I’ve been working full-time (overtime?) on it for the past couple of days, and have made major strides in development.
Stuff that got done in the last 2 days:
- Smooth scrolling of my effect selector is now even smoother.
- Fixed the “sketch” filter algorithm to use adaptive threshold instead of Canny for detecting edges in all kinds of lighting.
- Added a new “Ink” mode. Similar to sketch, but is simpler and cleaner. Black/Gray/White ink fills.
- “Noir” filter is now truly unique to my app. It’s not just another B&W filter with a hipster name. It will now actually make her red lipstick stand out. (Or anything else that’s red… like a baboon’s arse). Anyway, this was inspired by Schindler’s List… Just wanted y'all to know where my inspiration for that filter came from.
- Worked on another filter for Color sketches… Not exactly there yet. Might have to save this one for later.
- Icon designs & Button graphics.
- Figured out how to pause and resume recording a movie, and just finished coding it :) This was my biggest worry near the end of the project… but it was a few simple lines that I needed to add to GPUImage library to enhance its functionality. I will contribute this back to the open source community once I get it tested. It’s the least I could do to give back to the awesome library that made all of this possible in the first place.
What’s left to do:
- Tweak & refine the UI. Especially add depth using drop shadows.
- Hookup the record/pause/resume/stop buttons to call the proper actions.
- Figure out pricing strategy + build In-app purchase flow for freemium model.
- Build out the basic free filters: Original and Black&White
- Build out some additional filters: Simple instagram looking ones… and some that kinda have that 70s’ sexploitation film look.
- I want to add a simple way to customize each effect. For example, changing Noir filter to make green the pass-through color instead of red, or a slider to adjust the levels in the Ink filter. I already have an idea of how the UI would behave… WARNING! Feature Creep!!!
- Add Flurry instrumentation to track feature usage.
- Put some thought into building a Share Flow in the future.
Anyway… here’s another screenshot showing the improvements to “Sketch,” and the “Noir” filter. And it’s now an hour past the time that screenshot was taken. Goodnight!
work in progress
WORK IN PROGRESS ;)
Mic Check!
A quick update on where things are with me and the project.
“Scrolling like Butter” - Check!
After spending sleepless nights and countless hours at coffee shops (I spent so much time at Cafe La Vie, that Dirty Chai is no longer just my drink… it’s my nickname :/), I have finally gotten the smooth scrolling effect selector to work. For the longest time, I was stuck trying to figure out how this CADisplayLink object worked. I knew it contained the secret sauce for getting my UI to work my way, but there is this whole new world of NSRunLoops that I needed to understand first, and it wasn’t making much sense… until I stumbled across this ADC Video last night. Enhancing UX with UIScrollView. Suddenly, everything became clear. And, after yet another night of working till 5am and getting 3 hours of sleep, I got it to work!
No screenshots to share yet, as its still just as ugly as the prototype. Also, a screenshot wouldn’t suffice to showcase the smoothness of the scrolling. But I’m happy that it’s finally working after all that time spent in between coffee breaks, and attending phone interviews in the quiet bathroom corridors of malls. Those bathroom corridors are nice quiet spots… until the cleaning lady shows up with her cart. Then, they turn into the loudest echo chambers of rolling thunder. Anyway, speaking of phone interviews…
My next pay-Check!
Interviewing has been going great so far. In fact, a bit too good that I had to take a pause yesterday to make sure that I’m not rushing into this. I was chatting with an ex-Microsoft buddy, and he felt I might be making brash decisions due to my short term financial situation. And I could relate to what he was talking about. A job should be a lot more than just your next paycheck. My ideal job is one where I get paid for the skills and experience that I bring to the table, and one where I get a chance to learn new stuff that I wouldn’t get to learn/experience elsewhere. And all the companies that I’m currently interviewing with, each bring their own sets of pros and cons. Startup vs. Well established vs. Big scale problems vs. Personal growth opportunities vs. Commute. It’s a tough choice!
Anyway, he felt that I should actually take a break from the job search, and focus on building my mobile apps if possible… But, I have a different take on mobile apps. They are projects. Not companies.
Anyway, I went through a bunch of tech interviews in the last two weeks, and am at different stages of the process with different companies… ranging from scheduled on-sites, to verbal job offers. It was a busy interview schedule… So much so that I actually ended up taking a phone screen in between two interviewers at an on-site. (It’s not my fault they went over the scheduled time.) So, my next paycheck… it’s looking good, but no official word on it yet.
Last, but not least…
Pull-Up - Check!
I’ve never been able to do an unassisted pull-up (chin-up) in my lifetime… until yesterday :) Got to do one, albeit barely. But, it still counts!
Testing 1 2 3… Mic Check!
subscribe via RSS