Hey Christian, On 12/21/2011 04:41 PM, Christian König wrote: > On 20.12.2011 19:20, Maarten Lankhorst wrote: >> Hey Christian, >> >> On 12/20/2011 02:16 PM, Christian König wrote: >>> >>> Why do you want to change that anyway? >>> >>> The search for start codes was especially split out of the VLC stuff, >>> because start codes start are byte aligned anyway and it doesn't make much >>> sense to search for them using the slower peekbits& fillbits functions. >> Since 4 bytes are loaded at a time and bit aligning is fast enough, it's not >> that much slower, the reason I want this is to be able to add support for >> when the array size is> 1, currently and even with that patch its not >> handled, but if a slice is split between multiple buffers you can at least >> pick up where you left.. > Good argument, but we should complete the patch instead of leaving the code > in a condition where we just bail out with an assertion if the application > happens to not behave as we have planned. > >> for example with mplayer I have observed that the start code >> 0x00,0x00,0x01 and the actual value are in separate buffers for some codecs, >> and for wmv the following is said: >> * Some VC-1 advanced profile streams do not contain slice start codes; >> again, >> * the container format must indicate where picture data begins and ends. In >> * this case, pictures are assumed to be progressive and to contain a single >> * slice. It is highly recommended that applications detect this condition, >> * and add the missing start codes to the bitstream passed to VDPAU. >> However, >> * VDPAU implementations must allow bitstreams with missing start codes, and >> * act as if a 0x0000010D (frame) start code had been present. >> >> Since mplayer can chop up the start code and the 0x0d, you'd need a parser >> to handle this. >> I planned on using vlc to detect the lack of start code. > Well, sounds like a plan to me. > >>> The correct sollution would be to let fillbits return a boolean signaling >>> that the buffer(s) are depleted. >> Maybe, I want to start filling from the next stream if this is the case. > Yeah, take a look at the attachment, that's how I implemented it, but what > todo if we don't have any more inputs? > > Currently we load up to three extra bytes and then just continue to pretend > that the stream only contains zeros, well on a second though that isn't so > bad after all. > > I played around with it a bit today and it seems that the current behavior is > already the best we can do about it. > >>> Adding an interface definition without an implementation usually only makes >>> sense when we could have more than one different implementation. >> As the TODO says, I want to add support for array_size> 1 still, also next >> patch uses this interface, even if I didn't add the support for array_size> >> 1 yet. If I don't continuously reset vlc it should work correctly even when >> a stream has multiple buffers. > Take a look at the attached patch then, that should do it quite well. > >>>> - //assert(vlc->valid_bits>= num_bits); >>>> + assert(vlc->valid_bits>= num_bits || vl_vlc_bits_left(vlc)< >>>> num_bits); >>> Hui? bits_left is calculation the total number of bits left in the buffer, >>> while valid_bits is the number of currently loaded bits, so that check is >>> erroneous. >> Yes, but if you are near the end of the stream it is possible that peekbits >> can extend beyond it when doing vlc decoding, hence the second check. >> This is a special case for peekbits that would otherwise crash unnecessarily >> over DCT coefficients, any call that really consumes the bits will still >> fail. > Ah ok, now I understand your intentions. Well then check for "vlc->data >= > vlc->end" instead, since at the end of the stream even > "vl_vlc_bits_left(vlc)< num_bits" will fail ( at least if everything goes > right), and in the middle of a stream it will succeed in the case when there > is a missing fillbits! > > On 20.12.2011 21:08, Lucas Stach wrote: >> Hi all! >> Just jumping in with regard to the assert. >> >> Am Dienstag, den 20.12.2011, 19:20 +0100 schrieb Maarten Lankhorst: >> [snip] >>>>> return vlc->buffer>> (64 - num_bits); >>>>> } >>>>> @@ -130,7 +132,7 @@ vl_vlc_peekbits(struct vl_vlc *vlc, unsigned num_bits) >>>>> static INLINE void >>>>> vl_vlc_eatbits(struct vl_vlc *vlc, unsigned num_bits) >>>>> { >>>>> - //assert(vlc->valid_bits> num_bits); >>>>> + assert(vlc->valid_bits>= num_bits); >>>> Just commenting in all checks isn't such a good idea, since that affect >>>> performance very badly, a define which enables all assertions at once at >>>> the beginning of the file seems the better idea. >>> Sure. >> Please don't define your own semantic for this checks. Assert is only >> used in debug builds and there it shouldn't matter how it affects >> performance. In release builds assert is typically a no-op and therefore >> optimized away, but it could also be used to help the compiler optimize >> for the asserted conditions. >> Asserts should be never deactivated with code defines. > Those functions are called a couple of million times a second, so even if the > assertion is only tested in debug builds it has quite an effect on > performance, sometimes even masquerading real performance problems. So my > practice was to only uncomment them when I work on that part of the code. I > don't want to change the Assert semantics in any way, just a simple define > enabling certain assertions only under certain conditions should be > sufficient. I think it makes sense to have the debug builds enabling those asserts by default.
You could always do this in vl_mpeg12_bitstream.c when testing: #include "u_debug.h" #undef assert #include "vl_vlc.h" #define assert debug_assert On a related note, why is the vl code using assert.h directly instead of u_debug.h ? ~Maarten _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev