On 09/03/2017 08:06 PM, Mark Thompson wrote:
On 03/09/17 15:36, Jorge Ramirez wrote:
On 09/03/2017 02:27 AM, Mark Thompson wrote:
+ }
+
+ /* 2.1 update the AVCodecContext */
+ avctx->pix_fmt =
ff_v4l2_v4l2fmt_to_avfmt(capture->format.fmt.pix_mp.pixelformat,
AV_CODEC_ID_RAWVIDEO);
+ capture->av_pix_fmt = avctx->pix_fmt;
+
+ /* 3. set the crop parameters */
+ selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ selection.r.height = avctx->coded_height;
+ selection.r.width = avctx->coded_width;> + ret = ioctl(s->fd,
VIDIOC_S_SELECTION, &selection);
+ if (!ret) {
+ ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection);
+ if (ret) {
+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_G_SELECTION ioctl\n");
+ } else {
+ av_log(avctx, AV_LOG_DEBUG, "crop output %dx%d\n",
selection.r.width, selection.r.height);
+ /* update the size of the resulting frame */
+ capture->height = selection.r.height;
+ capture->width = selection.r.width;
+ }
+ }
What is this trying to do? I'm not sure that the coded_width|height values are
something you should be using here - in many cases they are larger than the
actual output (what does 1920x1080 H.264, which is coded as 1920x1088, do?).
Also, while they are often sensible for the stream if it comes from lavf and a
normal file container, they need not be set at all here (0x0).
I am just trying to crop the decoded frame size to what I understood are the
expected dimensions; if you look at buffer_ops_v4l2buf_to_avframe (used to
return the dequeued buffer to the frame) we use these variables to return the
frame dimensions back to ffmpeg.
When ffplaying 1920x1080 this is what xwininfo (window information utility for
X) returns:
[jramirez@igloo ~]$ xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0x560000c "Big Buck Bunny, Sunflower version -
/home/linaro/Videos/avc1.bbb_sunflower_1080p_30fps_normal.mp4"
Absolute upper-left X: 2240
Absolute upper-left Y: 204
Relative upper-left X: 0
Relative upper-left Y: 0
Width: 1920
Height: 1088
Depth: 24
Visual: 0xeb
Visual Class: DirectColor
Border width: 0
Class: InputOutput
Colormap: 0x560000b (not installed)
Bit Gravity State: ForgetGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +2240+204 -2240+204 -2240-148 +2240-148
-geometry 1920x1088+2230+166
maybe it works out nicely because the frames returned by the decoder are also
32 byte aligned?
this is what is encoded in the video
[jramirez@igloo Videos]$ ffprobe -show_frames
avc1.bbb_sunflower_1080p_30fps_normal.mp4 | more
1 [FRAME]
2 media_type=video
3 stream_index=0
4 key_frame=1
5 pkt_pts=2000
6 pkt_pts_time=0.066667
7 pkt_dts=2000
8 pkt_dts_time=0.066667
9 best_effort_timestamp=2000
10 best_effort_timestamp_time=0.066667
11 pkt_duration=1000
12 pkt_duration_time=0.033333
13 pkt_pos=236997
14 pkt_size=1116
15 width=1920
16 height=1080
17 pix_fmt=yuv420p
18 sample_aspect_ratio=1:1
19 pict_type=I
20 coded_picture_number=0
21 display_picture_number=0
22 interlaced_frame=0
23 top_field_first=0
24 repeat_pict=0
25 [/FRAME]
so if this is not correct, could you suggest or hint for a proper way please?
I think I've failed to emphasise the important point here: you can't use the
coded_width/coded_height fields in AVCodecContext to do something like this
because they need not be set. It is completely valid for the user to not set
them when using libavcodec, such that the decoder receives coded_width =
coded_height = 0 on input. It looks like that will then do something nasty in
your code, when it tries to crop the output to 0x0.
yep.
If you really need the width and height as found in the bitstream here then you
will need to find it yourself. (For a different case which does something very
similar to this, see the use of parsers qsvdec.)
that is ok, I can let the driver detect the discrepancy and raise an
event with the proper dimensions. this will be slightly different to
reinit since I will have to reconfigure the output queue as well but not
a major issue I think....maybe another 10 LOC or so
(There is also the secondary point that coded_width/coded_height do not
actually contain the output width/height because of stream cropping, but that
is probably less important and easier to fix.)
ok
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel