Commit Graph

64 Commits

Author SHA1 Message Date
Francisco Mónica
2f7011ca6e fix opencv#26276: removes trailing whitespaces 2025-05-24 02:53:37 +01:00
Francisco Mónica
1a4bf9d108 fix #26276: changes upon review
Revert the commit where parameter int cn (number of channels) was
replaced with int type (e.g: CV_8UC1) to preserve external API
compatibility. All realted logging and tests were updated accordingly.
2025-05-24 01:56:05 +01:00
Francisco Mónica
159b5ce9d1 fix #26276: skip test if writer won't open
Test cases are skipped when writer fails to open. Trailing whitespaces
were also removed
2025-05-18 17:44:08 +01:00
Francisco Mónica
67bf5e604d fix #26276: simplify test case(s)
Since no frames should be written, simply checking if video capture
fails to open is enough. Also reduced the frames to be written from
90 to 30
2025-05-18 16:11:53 +01:00
Francisco Mónica
e4515048ac fix #26276: changes upon review
Replaces implicit data manipulation with a warning-based approach.
Following reviewer feedback, data conversion is now explicitly
left to the user, and no automatic transformations are performed
in writeFrame().
2025-05-18 01:49:04 +01:00
Francisco Mónica
5ea3f51fcb fix #26276: adds more descriptive error messages 2025-05-02 15:46:28 +01:00
Francisco Mónica
62d6fa72d5 fix #26276: removes trailing whitespaces 2025-05-01 22:19:59 +01:00
Francisco Mónica
e9a0592552 fix #26276: conversion in writeFrame & test cases
Aligns FFmpeg backend behavior with MS Media Foundation and Android,
by moving the internal conversion logic to writeFrame().

This now handles all relevant format conversions:
- CV_8UC3 -> CV_8UC1 or CV_16UC1
- CV_8UC1 -> CV_8UC3 or CV_16UC1
- CV_16UC1 -> CV_8UC1 or CV_8UC3

It still corrects AVERROR(EAGAIN) handling, which was previously
misinterpreting it as an error and displays a warning when
writeFrame returns false. Adds more test cases ensuring all
possible conversions are properly tested.
2025-05-01 21:32:16 +01:00
Francisco Mónica
30a5ad1cee fix #26276: VideoWriter fails on grayscale images
The internal return values of the FFmpeg library are now correctly
handled in the FFmpeg backend. The writeFrame function now considers
that the FFmpeg return code AVERROR(EAGAIN) indicates the encoder needs
more input, so a new frame must be sent instead of treating it as a
real error. Additionally, the return value of
CvVideoWriter_FFMPEG::writeFrame is now properly propagated back to the
write function in the cap_ffmpeg.cpp file, which displays a warning
when writeFrame returns false. Additionally, a conversion of the input
to grayscale was implemented before entering FFmpeg backend, as the
encoder expects grayscale frames when isColor=false. This requires
converting from CV_8UC3 to grayscale (a simple color conversion is done
here using the cvtColor function). Finally, a new test case has been
implemented to verify that the grayscale conversion is correctly
applied.
2025-03-26 23:49:04 +00:00
Maksim Shabunin
43551b72d7
Merge pull request #26948 from mshabunin:fix-videoio-test-params
videoio: print test params instead of indexes #26948
_videoio_ test names changed - use string instead of index.
E.g. `videoio_read.threads/0` is now `videoio_read.threads/h264_0_RAW`.
It allows to filter tests independently of the platform.

**Notes:**
- not all tests has been updated - only simpler ones and those which have varying parameters depending on platform
2025-02-26 14:04:37 +03:00
Alexander Alekhin
4c7ea70051 videoio(test): re-enable FFmpeg tests on WIN32
- related PR25874
2024-12-26 12:29:45 +00:00
cudawarped
c9b57819b1
Merge pull request #25874 from cudawarped:videoio_ffmpeg_fix_encapsulate_ts
videoio: fix cv::VideoWriter with FFmpeg encapsulation timestamps #25874

Fix https://github.com/opencv/opencv/issues/25873 by modifying `cv::VideoWriter` to use provided presentation indices (pts).

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
2024-07-22 17:41:39 +03:00
Alexander Alekhin
5696413bbc ffmpeg/4.x: update FFmpeg wrapper 2024.05 2024-05-22 08:53:39 +00:00
cudawarped
81865b3d52 videoio: fix incorrect timestamps returned by VideoCapture when using raw video parsing mode 2024-01-03 08:15:31 +02:00
Alexander Alekhin
43007af42e ffmpeg/4.x: update FFmpeg wrapper 2023.12 2023-12-25 16:49:17 +00:00
Alexander Smorkalov
6a65678592 Use video stream fps first in FFmpeg backend for VideoCapture. 2023-11-03 15:39:37 +03:00
cudawarped
38bc519e4a
Merge pull request #24363 from cudawarped:videoio_ffmpeg_add_stream_encapsulation
videoio: Add raw encoded video stream muxing to cv::VideoWriter with CAP_FFMPEG #24363

Allow raw encoded video streams (e.g. h264[5]) to be encapsulated by `cv::VideoWriter` to video containers (e.g. mp4/mkv).

Operates in a similar way to https://github.com/opencv/opencv/pull/15290 where encapsulation is enabled by setting the `VideoWriterProperties::VIDEOWRITER_PROP_RAW_VIDEO` flag when constructing `cv::VideoWriter` e.g.
```
VideoWriter container(fileNameOut, api, fourcc, fps, { width, height }, { VideoWriterProperties::VIDEOWRITER_PROP_RAW_VIDEO, 1 });
```
and each raw encoded frame is passed as single row of a `CV_8U` `cv::Mat`.

The main reason for this PR is to allow `cudacodec::VideoWriter` to output its encoded streams to a suitable container, see https://github.com/opencv/opencv_contrib/pull/3569.

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
2023-10-25 13:21:01 +03:00
cudawarped
e4ad7e3778 VideoCapture: remove decoder initialization when CAP_PROP_FORMAT== -1 (rawMode == true) 2023-08-02 16:34:22 +03:00
Alexander Smorkalov
426b088754 FFmpeg/4.x: update FFmpeg wrapper 2023.6 2023-06-22 13:58:58 +03:00
cudawarped
024c836462 cv::VideoCapture: change CAP_PROP_FOURCC to prefer codec_id over codec_tag 2023-06-16 11:56:44 +03:00
cudawarped
871f931e95 VideoCapture: apply bitstream filter to all h264/5 raw streams 2023-04-25 13:52:28 +03:00
Alexander Alekhin
dbd4a0e5e6 videoio(ffmpeg): update tests with new Windows wrapper 2022-12-26 02:32:11 +00:00
Alexander Alekhin
cdaf4c7321 videoio(test): reduce number of test threads 2022-12-18 00:02:07 +00:00
Alexander Alekhin
39087fecdc
Merge pull request #22942 from alalek:videoio_test_update_hw_checks
* videoio(test): update PSNR check for H264/265

* videoio(test): reduce size for ffmpeg tests on 32-bit platforms
2022-12-12 12:38:14 +00:00
Alexander Alekhin
24d7eb0ca5 videoio(test): test skip due to non-updated FFmpeg wrapper 2022-12-08 17:18:29 +00:00
Maksim Shabunin
6ad216576d videoio/FFmpeg: added CV_16UC1 read/write support 2022-12-07 12:12:31 +03:00
Stefan Dragnev
a462f49b99 add support for CAP_PROP_ORIENTATION_AUTO to AVFoundation backend
* extract rotateFrame as free function, rename to applyMetadataRotation
* LegacyCapture::get() always return 0, if cap is null
2022-11-25 17:25:13 +01:00
Alexander Smorkalov
a6fadfe1c2 libav for jetson tk1 does not provide libavutil/display.h. 2022-10-25 10:21:20 +03:00
Alexander Smorkalov
ac91c45b0f
Merge pull request #22498 from alalek:update_ffmpeg_4.x
ffmpeg/4.x: update FFmpeg wrapper 2022.09
2022-09-14 09:34:12 +03:00
Alexander Alekhin
fb3fc5322c videoio(ffmpeg): update tests with new Windows wrapper 2022-09-12 13:09:40 +00:00
cudawarped
46d988e2cb
Merge pull request #22248 from cudawarped:ffmpeg_rtsp_low_fps
* Allow the number of threads FFMpeg uses to be selected during VideoCapture::open().
Reset interupt timer in grab if
err = avformat_find_stream_info(ic, NULL);
is interupted but open is successful.

* Correct the returned number of threads and amend test cases.

* Update container test case.

* Reverse changes added to existing videoio_container test case and include test combining thread change and raw read in the newly added videoio_read test case.
2022-09-12 09:12:28 +03:00
Alexander Alekhin
2ac62bccec videoio(test): fix build warning 2022-09-05 16:53:08 +00:00
cudawarped
7ce83f2a95 Skip new test until pr built into windows ffmpeg dll. 2022-08-03 09:41:06 +03:00
cudawarped
4b05765174 Initial fix to try and return a valid fourcc when _opencv_avcodec_get_name fails. 2022-08-02 17:18:42 +03:00
Stefan Dragnev
d09bd6f862 correct direction of displaymatrix rotation 2022-06-13 14:15:39 +00:00
Suleyman TURKMEN
b060151625 add test (DISABLED_open_from_web) 2022-03-30 15:01:02 +03:00
cudawarped
97c6ec6d49
Merge pull request #20978 from cudawarped:videocapture_read_raw_enchancement
Add capacity to Videocapture to return the extraData from FFmpeg when required

* Update rawMode to append any extra data recieved during the initial negotiation of an RTSP stream or during the parsing of an MPEG4 file header.
For h264[5] RTSP streams this ensures the parameter sets if available are always returned on the first call to grab()/read() and has two purposes:
1) To ensure the parameter sets are available even if they are not transmitted in band.  This is common for axis ip camera's.
2) To allow callers of VideoCapture::grab()[read()] to write to split the raw stream over multiple files by appending the parameter sets to the begining of any new files.
For (1) there is no alternative, for (2) if the parameter sets were provided in band it would be possible to parse the raw bit stream and search for the parameter sets however that would be a lot of work when that information is already provided by FFMPEG.
For MPEG4 files this information is only suplied in the header and is required for decoding.

Two properties are also required to enable the raw encoded bitstream to be written to multiple files, these are;
1) an indicator as to whether the last frame was a key frame or not - each new file needs to start at a key frame to avoid storing unusable frame diffs,
2) the length in bytes of the paramater sets contained in the last frame - required to split the paramater sets from the frame without having to parse the stream.  Any call to VideoCapture::get(CAP_PROP_LF_PARAM_SET_LEN) returning a number greater than zero indicates the presense of a parameter set at the begining of the raw bitstream.

* Adjust test data to account for extraData

* Address warning.

* Change added property names and remove paramater set start code check.

* Output extra data on calls to retrieve instead of appending to the first packet.

* Reverted old test case and added new one to evaluate new functionality.

* Add missing definition.

* Remove flag from legacy api.
Add property to determine if returning extra data is supported.
Always allow extra data to be returned on calls to cap.retrieve()
Update test case.

* Update condition which indicates CAP_PROP_CODEC_EXTRADATA_INDEX is not supported in test case.

* Include compatibility for windows dll if not updated.
Enforce existing return status convention.

* Fix return error and missing test constraints.
2021-11-23 21:18:55 +00:00
Alexander Alekhin
e705414bea videoio(plugins): support VideoCaptureParameters, CAPTURE_API_VERSION=1
- example: ffmpeg
2021-01-28 06:09:23 +00:00
MaximMilashchenko
467870415b
Merge pull request #19394 from MaximMilashchenko:params
add video capture parameters

* add parameters

* videoio: revert unnecessary massive changes

* videoio: support capture parameters in backends API

- add tests
- FFmpeg backend sample code
- StaticBackend API is done
- support through PluginBackend API will be added later

Co-authored-by: Milashchenko <maksim.milashchenko@intel.com>
Co-authored-by: Alexander Alekhin <alexander.a.alekhin@gmail.com>
2021-01-27 22:07:43 +00:00
Alexander Alekhin
afe9993376 Merge remote-tracking branch 'upstream/3.4' into merge-3.4 2020-07-28 17:25:20 +00:00
Alexander Smorkalov
7ed37b3fa5 MP4 autorotation tests and various fixes for Windows
- Added test for automated rotation for  MP4 videos with metadata
- Fix 180 degrees rotation bug
- Moved rotation logic to cv::VideoCapture implementation for FFmpeg and restore binary compatibility with FFmpeg wrapper.
2020-07-23 09:30:18 +03:00
Alexander Alekhin
d00e58cdb0 Merge remote-tracking branch 'upstream/3.4' into merge-3.4 2020-03-10 22:49:51 +00:00
Vadim Levin
09fe66e87f
Merge pull request #16713 from VadimLevin:dev/vlevin/ffmpeg_video_capture_bitrate
* feature: Add video capture bitrate read-only property for FFMPEG backend

* test: For WIN32 property should be either expected or 0.

Added `IsOneOf` helper function, enabled only for _WIN32.
2020-03-10 16:44:22 +03:00
Alexander Alekhin
560f85f8e5 Merge remote-tracking branch 'upstream/3.4' into merge-3.4 2020-01-28 14:26:57 +03:00
Pierre Letessier
0853085ec6 Merge pull request #16190 from pletessier:videocapture_skip_frames
Videocapture skip frames

* enable skipping frames

* update videoio_skip test
2020-01-26 10:19:09 +03:00
Alexander Alekhin
318cba4ce3 Merge remote-tracking branch 'upstream/3.4' into merge-3.4 2019-11-19 19:48:49 +00:00
cudawarped
aff8c9bd28 videoio: retrieve encoded frames through FFmpeg backend
- backport 15290
- add extra test case
2019-11-18 19:23:19 +03:00
cudawarped
0867e3188d Merge pull request #15290 from cudawarped:ffmpeg_raw_retrieve
Add retrieve encoded frame to VideoCapture

* Add capacity to retrieve the encoded frame from a VideoCapture object.

* Correct raw codec and pixle format output from ffmpeg capture.

* Remove warnings from build.

* Added VideoCaptureRaw subclass.

* Include abstract base class VideoCaptureBase and rename new subclass VideoContainer as suggested by mshabunin.

* Remove using.

* Change base class name for compatibility with jave bindings generator.

* Move grab and retrieve and add override specifier

* Add setRaw and readRaw to IVideoCapture interface
-setRaw to disable video decoding and enable bitstream filters from mp4 to h254 and h265.
-readRaw to return the raw undecoded/filtered bitstream.
Add createRawCapture to initiate a backend with setRaw enabled.
Remove inheritance and use an independant VideoContainer subclass with IVideoCapture member.

* Address unused parameter warings.
Remove VideoContainer from python bindings as it no longer returns a Mat.
Use opencv type uchar instead of unsigned char.
Add missing destructor to VideoContainer class.

* Address build warnings and include all params in documentation.

* Include deprecated bitstream filtering API.

* Update codec_id query to work with older ffmpeg api's.
Change api version defines to be consistent - most recent api version first.

* Fix typo.

* Update test to work with naming of new files in the extra repo

* Investigate test failure

* Check bytes read by ffmpeg

* Removed mp4 video container test

* Applied suggested changes.

* videoio: rework API for extraction of RAW video streams

- FFmpeg only

* address review comments
2019-11-18 17:07:06 +03:00
Alexander Alekhin
ab24325df3 videoio(test): avoid raw ptr in ffmpeg tests
causes leaks if FFmpeg is disabled through OPENCV_VIDEOIO_PRIORITY_FFMPEG=0
2019-06-20 17:48:18 +03:00
Maksim Shabunin
9702987209 Framework for dynamic videoio backends, FFmpeg and GStreamer plugins 2019-02-26 13:50:30 +03:00