Re: Question on new codec API
"David McPaul" <dmcpaul-bzGI/[email protected]> Sat, 06 Dec 2003 01:12:44 +1100 EST
| Newsgroups | gmane.os.openbeos.mediakit |
|---|---|
| Message-ID | <26023410106-BeMail@HackerZone1> |
This is a multipart message in MIME format.
------------Zoidberg-BeMail-temp--------
Mime-Version: 1.0
Content-Type: text/plain; charset="windows-1252"
Content-Transfer-Encoding: 7bit
Heya,
Well time for bed.
Attached is what I have done so far.
Basically some hard parts are still left. Using the index to
position the stream as required (ie Seek and ReadNextChunk). I will
look at them tommorrow.
Also, the reader currently only works for OpenDML AVI files.
Adding support for original AVI files should just be a matter of using
the original index type instead of the extended one since original is a
subset of OpenDML. I will look at adding that too.
Something to note, a lot of the code that handles the Audio data is
taken from some example code that BeOS sent to codec developers. All
the video parsing code is my own.
I cc'ed you since I vaguely remember this list not liking
attachments.
Regarding the supplying of the stream number vs not supplying it.
I am generally against casting void pointers to something they are not
just to find out what they really are so I can cast properly.
Cheers
David
>
> > > > The GetNextChunk(void *cookie,
> > > > void **chunkBuffer, int32 *chunkSize,
> > > > media_header *mediaHeader)
> > > >
> > > > Method does not supply a streamnumber which makes it difficult
> > > > to
> > > > determine which cookie I need to cast to.
> > >
> > > The idea is that AllocateCookie gets called once for each stream,
> > > so
> > > you can put everything needed for the stream (even it's number)
> > > into the cookie, and common data into the Reader class itself.
> >
> > Hmm, I am thinking of a stream as being a stream of audio or video
> > data.
> > Are you thinking of a stream being the file?
> No, a stream is a track inside a file, either audio or video
>
>
> > > > I think all the methods need to supply this parameter
> > > >
> > > > FreeCookie, GetStreamInfo, Seek.
> > >
> > > We could do that, but do we really need it?
> > > What exactly are you trying to do?
> >
> > Well, my AVI reader handles 2 types of streams. Audio and Video.
> Ok, was to be expected :)
> >
> > So I made a seperate cookie for each type. Perhaps that was wrong
> > of me.
> Perhaps the api is wrong, no problem.
>
> > I was expecting that a streamnumber would be supplied so I can
> > determine what data to supply (audio or video and from what track).
> > Also some containers have multiple audio or video tracks so how do
> > I
> > determine which one I should be reading in GetNextChunk?
>
> well, my idea was that each cookie hold all this information,
> like current position of the stream, type, whatever.
>
> until we find a better solution (which could mean adding the stream
> number as parameter)
> you could add a int32 stream_id to the top of both cookie structures,
> so what they are
> at the same place.
>
> You can initialize it inside AllocateCookie, and access it in
> GetNextChunk
>
> like:
>
> struct a_cookie {
> int32 stream_index;
> someing else for audio...
> }
>
> struct v_cookie {
> int32 stream_index;
> someing else for video...
> }
>
> doesn't matter which type you use for initial comparing of stream
> index,
> since it's at the same position in both cookies. you just need to
> initialize
> it in AllocateCookie()
> if (static_cast<a_cookie *>(cookie)->stream_index ==
> whatever_number_you_expect) {
> a_cookie *a = static_cast<a_cookie *>(cookie);
> // handle audio stream
> } else {
> v_cookie *v = static_cast<v_cookie *>(cookie);
> // handle video stream
> }
>
>
> you could also (and that was my original intention) use a common
> cookie structure like
>
> struct the_cookie {
> int64 position;
> int32 stream_2cc; // two character code used in avi for htis stream
> bool is_audio;
> ...
> }
>
> so that you don't have to care about the stream index number, because
> the cookie contains everything to find the next chunk of data.
> You just need to properly initialize it with the right values in
> AllocateCookie
> so that you can use it opaque.
>
> However, I haven't written anything yet that would use it this way,
> so
> I don't know for sure if there is a benefit.
> I would like to try it, but if it proves to be useless, we can change
> it.
------------Zoidberg-BeMail-temp--------
Content-Transfer-Encoding: base64
Content-Disposition: Attachment
Content-Type: application/zip; name=AVIReaderPlugIn.zip
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
AACNJgAAAAA=
------------Zoidberg-BeMail-temp----------
--
Some programming languages manage to absorb change, but withstand
progress.
-- Epigrams in Programming, ACM SIGPLAN Sept. 1982