TweetFollow Us on Twitter

June 94 - Somewhere in QuickTime

SOMEWHERE IN QUICKTIME

Basic Movie Playback Support

PETER HODDIE


Adding basic QuickTime movie playback support to most applications is simple, often just one day's work. Developers who want to do this turn first to Inside Macintosh: QuickTime , where it says to use a movie controller component. In Inside Macintosh: QuickTime Components,  you find some elementary movie controller code samples, followed by a large reference section. This is usually enough to get started, but there are a few common problems. This column addresses some of them, with special attention to compatibility with future QuickTime releases. It assumes you're familiar with basic QuickTime and movie controller concepts.

OPENMOVIEFILE
All QuickTime movie files contain a movie resource, usually stored in the file's resource fork, and the actual movie data, stored in the file's data fork. To support cross-platform QuickTime movies, QuickTime's Movie Toolbox also allows the movie resource to be stored in the data fork along with the movie's data. (To learn how this is done, see John Wang's Somewhere in QuickTime column in develop  Issue 17.) The usual sequence of calls to load a QuickTime movie from a file is: OpenMovieFile, NewMovieFromFile, CloseMovieFile.

In the common case of the movie resource stored in the resource fork, OpenMovieFile returns a file reference to the resource fork of the movie file, NewMovieFromFile loads the movie resource from that resource fork and creates a QuickTime movie, and CloseMovieFile closes the resource fork.

But if the movie was created on a computer running Microsoft Windows and QuickTime for Windows (using AdobeTM Premiere, for example), the file won't have a resource fork. Still, you can use the exact same sequence of calls. When OpenMovieFile is called, the file reference returned refers to the data fork; NewMovieFromFile loads the movie from the data fork, and CloseMovieFile closes the data fork.

Some developers don't use OpenMovieFile; they use FSpOpenResFile instead. While this works fine with movies made specifically for the Macintosh, it fails miserably otherwise. There's a sample movie with no resource fork, QuickBuck, on this issue's CD, so you can test this situation with your applications.

If you need to know whether OpenMovieFile opened the resource fork or the data fork, you can examine the file reference it returns, as follows:

pascal Boolean IsDataFork(short fileReference)
{
    FCBPBRec    anFCB;
    Str63       fName;

    anFCB.ioVRefNum = 0;
    anFCB.ioRefNum = fileReference;
    anFCB.ioFCBIndx = 0;
    fName[0] = 0;
    anFCB.ioNamePtr = (StringPtr)fName;

    if (PBGetFCBInfoSync(&anFCB) != noErr)
        return false;

    return (anFCB.ioFCBFlags & 0x0200) == 0;
}

NEWMOVIECONTROLLER
When you need a user interface for playing a movie, you should use NewMovieController to create a movie controller appropriate for use with that movie.

A common mistake is to instead use the Component Manager routine FindNextComponent or OpenDefaultComponent to locate a movie controller. This finds the first movie controller in the system's list of registered components. QuickTime has always contained only one movie controller, so this worked fine. However, future versions of QuickTime will almost certainly include other movie controllers, so the first one isn't necessarily the most appropriate one.

To help track down those offending applications that don't use NewMovieController, there's a system extension on this issue's CD which contains a different movie controller. You'll also find a movie, Other Controller Movie, that should  invoke the sample movie controller. If any other movie invokes the sample movie controller, or if Other Controller Movie invokes the standard movie controller, the application you're testing isn't using NewMovieController. This will cause undesirable results in the not-so-distant future.

UPDATE EVENTS
If you use a movie controller in the recommended way (that is, you allow all events to be filtered through MCIsPlayerEvent), it updates all areas of the window covered by the movie and the movie's controls. Usually that's all a window contains, so all update events are completely handled by the movie controller. This works so well that some developers actually forget to support update events at all.

Unfortunately, it's not always so simple. QuickTime movies aren't always rectangular. If the movie is round and the window is rectangular (as in Figure 1), there are areas in the window that are not covered by the movie or the movie controls. Any update events in these areas are the responsibility of the application. [IMAGE 022-025_Somewhere_in_QT_2.GIF]

Figure 1. A nonrectangular movie

For applications using MCIsPlayerEvent, handling update events is easy:

BeginUpdate(theWindow);
EraseRect(&theWindow->portRect);
EndUpdate(theWindow);

This sample code erases all areas of the window besides the movie and its controls. Normally, erasing the portRect of the window would erase the entire window, but MCIsPlayerEvent sets the update region to just the areas it didn't already handle.

If you don't handle update events, things are even worse than you might think. The window won't be updated correctly, but more important, the operating system will keep generating new update events. Update events have a higher priority than idle events, so the system will never generate idle events -- the movie will receive no time to play.

A sample round movie is provided on this issue's CD so that you can test your handling of update events.

KEYSTROKES
The standard movie controller provides for extensive keyboard control from the user but ignores keystrokes by default. They can be enabled with a single line of code:

MCDoAction(mc, mcActionSetKeysEnabled, (void *)true);

You might want to enable keystrokes only under certain circumstances. For example, a word processor might allow the movie controller to receive keystrokes only when a movie is selected. You can use the mcActionSetKeysEnabled action to enable and disable keystrokes as necessary.

MOUSE CLICKS
All applications that use the standard movie controller pass mouse clicks on to the controller. But not all applications pass mouse clicks made on the movie itself. Failure to pass such clicks will cause problems with any future movie controllers that allow the user to interact directly with the contents of the movie. For example, a movie controller might allow the user to pan around the image by dragging on the movie; if mouse clicks aren't passed through, using either MCClick or MCIsPlayerEvent, this feature won't work.

MOVIE CONTROLLER HELP
The standard Apple movie controller is simple enough for most people to understand immediately, but it supports help balloons anyway (future movie controllers might be less obvious). If Balloon Help is turned on, the standard movie controller automatically displays help for its various controls, as well as for the QuickTime movie itself. You don't have to do anything at all for this to work.

A problem can arise if your application puts up its own help balloons. Since QuickTime movies are often embedded in a larger document, the help balloons may conflict. The result is that the movie controller's help balloon alternates with the application's help balloon. (Use Balloon Help with the Scrapbook desk accessory included with QuickTime to see what this looks like.)

The preferred solution is to stop the application from displaying a help balloon when the cursor is over a QuickTime movie or movie control. It's easy to tell whether a given point in a window intersects the movie:

Boolean PointInMovieController(MovieController
        mc, WindowPtr w, Point where)
{
    RgnHandle   rgn;
    Boolean     result = false;

    rgn = MCGetWindowRgn(mc, w);
    if (rgn != nil) {
        result = PtInRgn(where, rgn);
        DisposeRgn(rgn);
    }
    return result;
}

A second solution is to stop the movie controller from displaying its help balloons -- necessary if you want to display your own help for QuickTime movies. To do this, install an action filter on the movie controller. Every action that occurs in the movie controller (play, step, update, key down, and so on) is passed through a single filter function. Through this filter, an application can gain access to all activity that occurs in the movie controller.

The MegaMovies application on this issue's CD provides a window that displays events that pass through the action filter. The action of interest is mcActionShowBalloon. When this action is sent, QuickTime is about to put up a new help balloon. One of the parameters passed to the action filter is a pointer to a Boolean. The filter can set this Boolean to false to tell the movie controller not to show a balloon. The following code fragments show how to install a simple action filter to prevent the movie controller from displaying help balloons.

pascal Boolean noBalloonsActionFilter 
                (MovieController mc, short action, 
                 void *params, long refCon)
{
    if (action == mcActionShowBalloon)
        *(Boolean *)params = false;
    return false;
}

. . .
MCSetActionFilterWithRefCon(mc, 
        &noBalloonsActionFilter, 0);

CURSOR SHAPE
Many applications change the shape of the cursor depending on what it's currently over. The standard movie controller never changes the cursor, but other movie controllers might want to. Unfortunately, many applications need to control the cursor themselves -- when a movie controller changes the cursor, these applications change it back immediately.

A simple solution is for applications to change the cursor only when it's first placed over a movie. (To determine whether a point is over the movie, use PointInMovieController.) After that, let the movie controller control the cursor until it exits the area over the movie. To give the movie controller the opportunity to change the cursor's shape, you must call either MCIsPlayerEvent or MCIdle frequently while the cursor is over the movie, even if the movie is stopped. The sample movie controller on this issue's CD changes the cursor when it's over the movie, providing an easy way to debug such a scheme.

WINDOW ALIGNMENT
A simple way to improve a QuickTime movie's playback performance is to ensure that the movie is at a good location on the screen. The exact definition of a "good location" varies, based on the screen depth and the processor. A typical good location is one where the first pixel of each scan line begins on a long-word boundary. This allows the decompressors to write data in the most efficientway. On slower machines, proper placement can provide the necessary performance improvement to deliver smooth playback.

Fortunately, applications don't have to understand the details of how to find a good location. QuickTime's Image Compression Manager provides routines to position a window at these locations. When you create a window, you can use AlignWindow to move it to a good location before making it visible. If a window is to be moved, AlignScreenRect will modify the chosen location to make it a good location. When the user drags a window, call DragAlignedWindow instead of DragWindow to place the window in a good location. Examples of these calls are shown below.

WindowPtr   w;
Movie       m;
Rect            r;

// Code to create a properly aligned window.
w = GetNewCWindow(128, nil, (WindowPtr)-1);
m = getMovie();
GetMovieBox(m, &r);
AlignWindow(w, false, &r, nil);

// Code to drag a window with a movie in it and
// keep the window aligned properly.
GetMovieBox(m, &r);
DragAlignedWindow(w, theEvent.where, nil, &r, nil);

These alignment routines were added in QuickTime 1.5, so make sure that QuickTime 1.5 or later is installed before you call them.

MOVIE CONTROLLER EDITING
The standard movie controller supports the editing commands Undo, Cut, Copy, Paste, and Clear, but this functionality is turned off by default. To turn it on, call MCEnableEditing as follows:

MCEnableEditing(mc, true);

You can then use movie controller routines to implement editing:

Movie       m = nil;

switch (editMenuSelection) {
    case menuUndo:      MCUndo(mc);
                            break;
    case menuCut:       m = MCCut(mc);
                            break;
    case menuCopy:      m = MCCopy(mc);
                            break;
    case menuPaste: MCPaste(mc, nil);

Now you have to enable and disable the various menu items. You could call MCGetControllerInfo, which returns a long word of flags indicating, among other things, which Edit menu items should be enabled.With QuickTime 1.5, there's an easier way: call MCSetUpEditMenu, and the movie controller will enable and disable the items in the Edit menu for you.

MCSetUpEditMenu(mc, theEvent.modifiers, editMenuHandle);
[IMAGE 022-025_Somewhere_in_QT_3.GIF]

Standard [IMAGE 022-025_Somewhere_in_QT_4.GIF]

Modified


This routine will even change the menu contents if appropriate. For example, Undo becomes Undo Paste if the last movie controller action was Paste; after Undo Paste is chosen, it becomes Redo Paste. What's more, if the user holds down modifier keys when pulling down a menu, other commands change as well. For example, holding down the Option key changes Paste to Add and Clear to Trim. (See Figure 2.)

Figure 2. Standard and modified Edit menus

MCSetUpEditMenu assumes the Edit menu is arranged in the standard way. If yours is nonstandard, you'll need to use MCGetMenuString to obtain the appropriate text for each standard Edit command, and then enable and disable the menu items according to the information from MCGetControllerInfo.

JUST DO IT
It's so easy to add movie playback support that it's often well worth the effort. As long as you keep these few simple things in mind, you shouldn't have any problems, even with future versions of QuickTime.

PETER HODDIE writes code to introduce hard-to-find bugs into QuickTime. In his spare time he writes code to introduce even harder-to-find bugs into QuickTime. *

Thanks to Jim Batson, Ken Doyle, and John Wang for reviewing this column. *

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

OmniOutliner Pro 4.2 - Pro version of th...
OmniOutliner Pro is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually designed to help you think. It's... Read more
VLC Media Player 2.2.1 - Popular multime...
VLC Media Player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, MP3, OGG, ...) as well as DVDs, VCDs, and various streaming protocols. It... Read more
Nisus Writer Pro 2.1.1 - Multilingual wo...
Nisus Writer Pro is a powerful multilingual word processor, similar to its entry level products, but brings new features such as table of contents, indexing, bookmarks, widow and orphan control,... Read more
Tinderbox 6.2.0 - Store and organize you...
Tinderbox is a personal content management assistant. It stores your notes, ideas, and plans. It can help you organize and understand them. And Tinderbox helps you share ideas through Web journals... Read more
OmniOutliner 4.2 - Organize your ideas,...
OmniOutliner is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually designed to help you think. It's... Read more
Things 2.5.4 - Elegant personal task man...
Things is a task management solution that helps to organize your tasks in an elegant and intuitive way. Things combines powerful features with simplicity through the use of tags and its intelligent... Read more
NeoOffice 2014.10 - Mac-tailored, OpenOf...
NeoOffice is a complete office suite for OS X. With NeoOffice, users can view, edit, and save OpenOffice documents, PDF files, and most Microsoft Word, Excel, and PowerPoint documents. NeoOffice 3.x... Read more
iPhoto Library Manager 4.2 - Manage mult...
iPhoto Library Manager allows you to organize your photos among multiple iPhoto libraries, rather than having to store all of your photos in one giant library. You can browse the photos in all your... Read more
Web Snapper 3.3.8 - Capture entire Web p...
Web Snapper lets you capture Web pages exactly as they appear in your browser. You can send them to a file as images or vector-based, multi-page PDFs. It captures the whole Web page - eliminating the... Read more
TeamViewer 10.0.41404 - Establish remote...
TeamViewer gives you remote control of any computer or Mac over the Internet within seconds, or can be used for online meetings. Find out why more than 200 million users trust TeamViewer! Free for... Read more

Chainsaw Warrior: Lords of the Night has...
It's time to put the Darkness back in its place now that Chainsaw Warrior: Lords of the Night has officially made it to iOS. | Read more »
A World of Ice and Fire Lets You Stalk 2...
George R. R. Martin’s A World of Ice and Fire, by Random House, is a mobile guide to the epic series. The new update gives you the Journeys map feture that will let you track the movements of 25 different characters. But don't worry, you can protect... | Read more »
Gameloft Announces Battle Odyssey, a New...
Battle Odyssey, Gameloft's newest puzzle RPG, is coming to the App Store next week. Set in the world of Pondera, you will need to control the power of the elements to defend the world from evil. You'll be able to entlist over 500 allies to aid you... | Read more »
Fusion - HDR Camera (Photography)
Fusion - HDR Camera 1.0.0 Device: iOS Universal Category: Photography Price: $1.99, Version: 1.0.0 (iTunes) Description: Fusion creates HDR (high dynamic range) photos by capturing different exposures and then combining them into one... | Read more »
Sago Mini Toolbox (Education)
Sago Mini Toolbox 1.1 Device: iOS Universal Category: Education Price: $2.99, Version: 1.1 (iTunes) Description: Come build with the Sago Mini friends! Use a wrench, try a saw, or hammer some nails. From sewing hand puppets to... | Read more »
You Should Probably Grab Hitman GO While...
Hitman GO is a surprisingly cool (yet also incredibly drastic) departure from the Hitman series. It's well worth playing for any puzzle game fans out there, and at the moment you can get your hands - or garrotte if you will - on it for a mere $0.99... | Read more »
IFTTT is Bringing Do Button and Do Note...
IFTTT has announced Do Button and Do Note for the Apple Watch. Do Button lets you make your own personalized button that can connect to things like your Google Drive, control the temperature in your home with Nest Thermostat, or turn the lights on... | Read more »
How Many Days, Hours, and Minutes Are Le...
Countdown, by Yves Tscherry, is now available on the App Store. The app keeps track of countdowns to your favorite things such as someones birthday or days till the New Year. You can display the time in seconds, minutes, hours, days, weeks, months,... | Read more »
The All-New Misfit 2.0 App is Available...
Misfit has just given their app a complete overhaul. Misfit 2.0 now has a brand new interface with a sleek design and is easier to navigate. You'll be able to sync your Misfit device and look up health and fitness information faster than ever before... | Read more »
Halo: Spartan Strike (Games)
Halo: Spartan Strike 1.0 Device: iOS Universal Category: Games Price: $5.99, Version: 1.0 (iTunes) Description: Delve into 30 challenging missions through cities and jungles using a devastating arsenal of weapons, abilities and... | Read more »

Price Scanner via MacPrices.net

TigerText Introduces First Secure Enterprise...
TigerText, a provider of secure, real-time messaging for the enterprise, has announced the launch of TigerText for the Apple Watch. TigerText for the Apple Watch enables users to securely send and... Read more
The Conservation Fund Partners with Apple To...
The Conservation Fund has announced that it will partner with Apple to help protect working forests in the United States. The Apple initiative will conserve more than 36,000 acres of working... Read more
Clearance 13-inch 2.6GHz Retina MacBook Pro a...
B&H Photo has clearance 2014 13″ 2.6GHz/128GB Retina MacBook Pros now available for $1099, or $200 off original MSRP. Shipping is free, and B&H charges NY sales tax only. Read more
Apple refurbished 2014 13-inch Retina MacBook...
The Apple Store has Apple Certified Refurbished 2014 13″ Retina MacBook Pros available for up to $400 off original MSRP, starting at $979. An Apple one-year warranty is included with each model, and... Read more
iMacs on sale for up to $205 off MSRP, NY tax...
B&H Photo has 21″ and 27″ iMacs on sale for up to $205 off MSRP including free shipping plus NY sales tax only: - 21″ 1.4GHz iMac: $1019 $80 off - 21″ 2.7GHz iMac: $1189 $110 off - 21″ 2.9GHz... Read more
Sale! 16GB iPhone 5S for $1 with service
Best Buy is offering 16GB iPhone 5Ss for $1.00 with 2-year activation at a participating cellular provider. Choose free home shipping and activation, or buy online and activate during in-store pickup... Read more
Apple refurbished 2014 MacBook Airs available...
The Apple Store has Apple Certified Refurbished 2014 MacBook Airs available starting at $679. An Apple one-year warranty is included with each MacBook, and shipping is free. These are currently the... Read more
27-inch 3.5GHz 5K iMac on sale for $2349, sav...
 Adorama has the 27″ 3.5GHz 5K iMac in stock today and on sale for $2349 including free shipping plus NY & NJ sales tax only. Their price is $150 off MSRP. For a limited time, Adorama will... Read more
Save up to $380 on an iMac with Apple refurbi...
The Apple Store has Apple Certified Refurbished iMacs available for up to $380 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 27″ 3.5GHz 5K iMac – $2119 $... Read more
iFixIt Teardown Awards 12-IInch Retina MacBoo...
iFixIt has posted its illustrated teardown of the new 12-inch MacBook Retina. They note that this new MacBook is less than half the thickness of the last Apple notebook called just “MacBook” back in... Read more

Jobs Board

*Apple* Watch SW Application Project Manager...
**Job Summary** The Apple Watch software team is looking for an Application Engineering Project Manager to work on new projects for Apple . The successful candidate Read more
*Apple* Solutions Consultant - Retail Sales...
**Job Summary** As an Apple Solutions Consultant (ASC) you are the link between our customers and our products. Your role is to drive the Apple business in a retail Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
Technical Project Manager - *Apple* Pay - A...
**Job Summary** Apple Pay is seeking an experienced technical PM to…manage the on boarding of new merchants for the Apple Pay platform in the US Within this role you Read more
Senior Identity Architect - *Apple* Pay - A...
**Job Summary** Apple , Inc. is looking for a highly motivated, innovative and hands-on senior identity architect to join the Apple Pay Engineering team. You will Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.