[MPlayer-dev-eng] [PATCH] RFC: CrystalHD decoder support
Philip Langdale
mplayer.philipl at overt.org
Tue Dec 21 04:36:15 CET 2010
On 2010-12-20 19:15:13, Reimar Döffinger wrote:
>
> Really? That amount of buffered frames would mean this hardware is
> completely
> useless for video telephone or any other interactive application.
It seems ridiculous but I have not been able to convince it to give me
a decoded
frame without shoving more data into it - no matter how long I wait.
> This is more than 4 seconds, you are going to run into _serious_
> issues,
> with that, e.g. if combined with uncompressed multichannel PCM audio
> 4 seconds is probably more than MPlayer will be able to buffer,
> causing
> playback to fail.
Highly likely :-/
> I'm also not sure how
> QUERY_UNSEEN_FRAMES should be used. I don't
> know how many complete frames are in the decoder waiting to be
> decoded
Why don't you know that? At least for the non-interlaced,
non-error-concealment
case it should be just a matter of "number of packets in - number of
frames out".
> and mplayer seems to be
> comparing the result with buffered_pts which comes from the pts
> passed to each decode call,
> so I'm pretty confused.
> Figure out how timestamp reordering is supposed to be done, then the
> right
> solution should become more obvious.
> Unless of course they went the cheap way and don't have any way to
> figure out
> with input time stamp belongs to which output frame, in which case
> that solution
> would become completely useless for any variable frame-rate
> content...
So, It wasn't clear to me that I could assume every call to decode gave
me a
complete encoded frame (as opposed to just a bunch of bytes) but it
seems clear
that is true. Unfortunately, the current crystalhd code will not return
timestamps
on decoded frames. It's supposed to support passing in a pts to the
input function
and having it come back on the output but this seems to only work with
70012 hardware.
So yes, I am screwed in that regard.
> A too large value will work most of the time, but is likely to cause
> issues with timestamp wraps.
Ok - well, I can now shrink this down to the real value but it may
still be large
enough to cause problems.
> demuxers aren't concerned with what comes after. Take a look
> at mpi_no_picture in vd_ffmpeg.c, it's likely you have to do
> something like that (though actually that should only
> really apply to the interlaced case you mention below).
> Hm, I just saw you actually use that, but I have some doubts
> if it is correct to use it for the ReadyListCount case.
> And the behaviour of the native demuxers and lavf should behave
> the same if you use -nocorrect-pts.
I actually thought I removed it from the ReadyListCount case - I will
get
rid of that.
> The point would be to have code sharing with e.g. VLC, at least in
> the long run.
> There is not enough manpower available in the MPlayer project
> to maintain this, I guarantee you that the moment you don't actively
> look after it it will bit-rot and become unusable in no time,
> while in the process probably wasting a good bit of mine and other's
> time.
Understood. Once I've got the other problems sorted out in the mplayer
context, I will look at pushing it down - but we'll definitely need to
change how vd_ffmpeg does QUERY_UNSEEN_FRAMES as part of that.
> That is not quite where the letter "c" goes in my alphabet...
Will fix.
> Can they be convinced to fix their header instead?
It would be nice. Apparently this was fallout from a change to avoid
that types
header getting pulled into kernel driver builds. Jarod hasn't been
responsive to
any of my emails so far, so we'll have to see.
> With regards to FFmpeg integration a LGPL version would be
> preferable.
No problem on my part.
> MPlayer already has a fast_memcpy function (two actually, depending
> on
> whether the source/target is normal memory or a memory-mapped
> device).
> And in difference to this variant using intrinsics it
> 1) will have predictable performance (yes, compilers still sometimes
> compile
> intrinsics in a way that negates any speed advantage)
> 2) it actually compiles on older compilers
Ok, I'll use that.
> <A number of comments on SPS/PPS decoding>
I took this function as-is from xbmc so I can't take credit for the
code style.
I'll rework it to address your comments.
> Pointless, query_format already checks that the format is supported.
> Also, why only IMGFMT_YUY2? That wastes a huge amount of bandwidth
> (unless the input is actual 4:2:2 - if the is even supported).
Cute isn't it? The 70015 only outputs YUY2 - even though it only
supports 420
input. The 70012 can apparently output YV12/NV12. *sigh*. So I had the
QUERY_FORMAT
handling there with an eye to supporting YV12 on the 70012 and then you
need the
dynamic check, but all the other implementations seem to have given up
and use YUY2
on both decoders. :-/
>> + format.height = sh->disp_h;
>> + if (format.height == 1088) {
>> + format.height = 1080;
>> + }
>
> That certainly isn't correct.
I need to investigate this more - the logic came from xbmc. Certainly
if I feed
it a stream where the raw metadata says 1088, it doesn't automatically
crop to 1080
on output.
> Shouldn't you do some stuff like closing the device and freeing some
> stuff
> in all those error cases?
Yes, I should.
> I have quite some doubts about this.
> The obvious one is: Why is the API designed in a way that you can end
> up with the
> two top_field == bottom_field cases and what are they supposed to
> mean.
> The less obvious one is: what exactly does interlaced mean?
> There is PAFF coding, there is MBAFF coding and then interlaced can
> be
> coded as progressive (even if it is a bad idea), what exactly does
> this
> one indicate (I have a suspicion that it actually mean PAFF).
I think that libcrystalhd is buggy with respect to setting these flags
- at least
on 70015. But it's resulted in some very strange values in my tests. I
haven't had
a chance to run through the samples in the ffmpeg collection to fully
establish what
the behaviour is in each of the three cases. I've tested on mpeg2
interlaced and an
h.264 stream where I'm not sure what the real encoding is - all I know
is I get full
frames comprised of interlaced fields and some frames are marked
progressive and
others are marked as top fields (and then I get three top fields in a
row...)
> I suspect that memcpy_pic is going to solve this easier.
> Still, a memcpy is not exactly fast at high resolutions.
No, and it's probably a big part of why this thing requires quite a lot
of work to
get it to decode 1080p in real time (sad).
Thanks for all the comments. I will address them and post an updated
diff, probably
this weekend. As I mentioned above, I'm not going to move it to ffmpeg
until I've got
it working properly - it's easier to debug the mplayer interactions in
a native codec.
Thanks!
--phil
More information about the MPlayer-dev-eng
mailing list