---
layout: page
title: "Changelog"
order: 3
---

New versions are released through GitHub, so the reference page is the [GitHub Releases](https://github.com/natario1/CameraView/releases) page.

> Starting from 2.4.0, you can now [support development](https://github.com/sponsors/natario1) through the GitHub Sponsors program. 
Companies can share a tiny part of their revenue and get private support hours in return. Thanks!

##### v2.6.1

- <small>[Video]</small> New: `takeVideo(FileDescriptor)` for file descriptors, thanks to [@sewar][sewar] ([#732][732])
- <small>[Video]</small> Improvement: fixed "no encoder found" issues for some devices ([#741][741])
- <small>[Camera2, Metering]</small> Improvement: increased metering timeout for touch metering ([#741][741])
- <small>[Camera2, Metering]</small> Improvement: extended touch metering to LEGACY devices ([#741][741])

<https://github.com/natario1/CameraView/compare/v2.6.0...v2.6.1>

### v2.6.0

- <small>[Metering]</small> New: `startAutoFocus(RectF)` will start 3A metering to a given rect instead of a spot ([#724][724]) 
- <small>[Permissions]</small> New: `app:cameraRequestPermissions` flag to disable the automatic activity permission request ([#718][718])
- <small>[Frame processing]</small> New: `setFrameProcessingPoolSize()` to set the number of Frame instances that can exist at any given time. Useful in conjunction with `setFrameProcessingExecutors()`. Please read docs ([#716][716])
- <small>[Frame processing]</small> New: `setFrameProcessingExecutors()` to set the number of threads involved in frame processing. Useful in conjunction with `setFrameProcessingPoolSize()`. Please read docs ([#716][716])
- <small>[Frame processing, Camera2]</small> Improvement: ensure that slow processing does now slow down the preview ([#716][716])

<https://github.com/natario1/CameraView/compare/v2.5.0...v2.6.0>

### v2.5.0

- <small>[Camera2]</small> New: support for RAW pictures with new APIs `setPictureFormat()` and `CameraOptions.getSupportedPictureFormats()`. Contains a **breaking change**: `PictureResult.getFormat()` is not an integer anymore but rather a `PictureFormat`. This API had no real purpose so this might not affect you ([#691][691])
- <small>[Camera2]</small> New: support for constraining the frame processing size through `setFrameProcessingMaxWidth()` and `setFrameProcessingMaxHeight()`. This can improve processing performance ([#691][691])
- <small>[Camera2]</small> New: support for choosing the frame processing format through `setFrameProcessingFormat()` and `CameraOptions.getSupportedFrameProcessingFormats()` ([#691][691])
- <small>[Camera2]</small> Improvement: Frame processing FPS for Camera2 is now smooth and typically better than Camera1. This required some **breaking changes** (see below) ([#691][691])
- <small>[Camera1, Camera2]</small> Improvement: improved internal threading ([#697][697])
- <small>[Camera1, Camera2]</small> Improvement: improvements to stability and edge cases behavior ([#696][696])
- <small>[Real time filters]</small> Change: filters do not need the experimental flag anymore ([#691][691])

The new frame processing approach will force you to update your code, because `Frame.getData()` is 
not a a byte[] anymore. The class of this object now depends on the engine being used. You can use 
`frame.getDataClass()` (or instanceof) to check.

If you are using the Camera1 engine, you will still receive byte arrays, so you can just cast `frame.getData()` to 
`byte[]`, assuming it's not done already by the compiler.

If you are using the experimental Camera2 engine, you will receive `android.media.Image`s instead.
This object will likely be accepted by frame processing libraries, and also offers access to raw byte data.
This change greatly improved the FPS performance, which is what matters the most at the library level.

<https://github.com/natario1/CameraView/compare/v2.4.0...v2.5.0>

### v2.4.0

- <small>[Camera2]</small> New: support for `previewFrameRate`. Controls preview FPS, snapshot FPS, processor FPS, thanks to [@vaibhavbhandula][vaibhavbhandula] ([#653][653])
- <small>[Camera1]</small> New: support for `previewFrameRate` for Camera1 ([#661][661])
- <small>[Camera2]</small> Fix: fix crashes when taking snapshots very early ([#651][651])
- <small>[Preview]</small> Fix: Fixed preview being upside-down for 180 degrees flips ([#651][651])
- Fix: other bug fixes ([#651][651])

<https://github.com/natario1/CameraView/compare/v2.3.1...v2.4.0>

##### v2.3.1

- <small>[Video]</small> Improvement: better timing for `onVideoRecordingStart()` thanks to [@agrawalsuneet][agrawalsuneet] ([#632][632])
- <small>[Video, Camera1]</small> Fix: fixed video errors when starting on specific devices ([#617][617])
- <small>[Video]</small> Fix: fixed crash when closing the app during video snapshots ([#630][630])
- <small>[Preview]</small> Fix: fixed crash when using `GL_SURFACE` ([#630][630])

<https://github.com/natario1/CameraView/compare/v2.3.0...v2.3.1>

### v2.3.0

- <small>[Camera2, Metering]</small> New: `startAutoFocus` is much more powerful and does 3A metering (AF, AE, AWB) ([#574][574])
- <small>[Camera2, Metering]</small> New: `setPictureMetering(boolean)` decides whether to do metering before `takePicture()`. Defaults to true to improve quality. ([#580][580])
- <small>[Camera2, Metering]</small> New: `setPictureSnapshotMetering(boolean)` decides whether to do metering before `takePictureSnapshot()`. Defaults to false to improve latency. However, you can set this to true to greatly improve the snapshot quality, for example to support `Flash`. ([#580][580])
- <small>[Camera2, Metering]</small> New: metering extended to many more cameras, which can now use `startAutoFocus` or the focus gesture ([#574][574])
- <small>[Camera2, Metering]</small> Improvement: `onAutoFocusEnd` is now guaranteed to be called ([#574][574])
- <small>[Camera2, Metering]</small> Improvement: taking picture does not invalidate the previous focus ([#574][574])
- <small>[Camera2, Metering]</small> Improvement: better metering when zoomed in ([#574][574])
- <small>[Real time filters]</small> **Breaking change**: `Filter` interface signatures now accept timestamps for animations ([#588][588])
- <small>[Overlays]</small> New: you can now use `addView()` and `removeView()` to add or remove overlays at runtime (see docs) ([#588][588])
- <small>[Video]</small> Improvement: better encoder selection ([#588][588])
- Fix: fixed various bugs and improved stability ([#588][588])

<https://github.com/natario1/CameraView/compare/v2.2.0...v2.3.0>

### v2.2.0

- <small>[Real time filters]</small> New: `SimpleFilter` class accepts a fragment shader in the constructor ([#552][552])
- <small>[Real time filters]</small> New: `MultiFilter` to apply more than one filter at the same time ([#559][559])
- <small>[Video]</small> Improvement: query device encoders before configuring them. Should fix issues on multiple devices ([#545][545])
- <small>[Video]</small> Fix: `takeVideoSnapshot` not working unless you set a max duration ([#551][551])
- <small>[Video]</small> Fix: `takeVideo` crashing on Camera2 LEGACY devices ([#551][551])
- <small>[Frame Processing]</small> Fix: fixed dead Frames issues and improved error messages ([#572][572])
- Fix: fixed `CameraView` appearance in the layout editor ([#564][564])

<https://github.com/natario1/CameraView/compare/v2.1.0...v2.2.0>

### v2.1.0

This release adds experimental support for [real-time filters](../docs/filters) thanks to [@agrawalsuneet][agrawalsuneet].
Please read the documentation page for usage instructions.

- New: Real-time filters support ([#527][527])
- New: Add filters through XML ([#535][535])
- New: Map filter controls to scroll/pinch gestures ([#537][537])

<https://github.com/natario1/CameraView/compare/v2.0.0...v2.1.0>

### v2.0.0

- Fix: bug with picture recorder ([#521][521])
- Fix: video snapshots appearing black ([#528][528])
- Fix: video snapshots exceptions and audio issues ([#530][530])

<https://github.com/natario1/CameraView/compare/v2.0.0-rc2...v2.0.0>

##### v2.0.0-rc2

- Fix: crashes when stopping video snapshots ([#513][513])
- Fix: dependencies missing, leading to runtime crashes ([#517][517])

<https://github.com/natario1/CameraView/compare/v2.0.0-rc1...v2.0.0-rc2>

### v2.0.0-rc1

This is likely to be the last release before v2.0.0.

- New: support for watermarks and animated overlays ([docs](../docs/watermarks-and-overlays)), thanks to [@RAN3000][RAN3000] ([#502][502], [#421][421])
- New: added `onVideoRecordingStart()` to be notified when video recording starts, thanks to [@agrawalsuneet][agrawalsuneet] ([#498][498])
- New: added `onVideoRecordingEnd()` to be notified when video recording ends ([#506][506])
- New: added `Audio.MONO` and `Audio.STEREO` to control the channel count for videos and video snapshots ([#506][506])
- New: added `cameraUseDeviceOrientation` to choose whether picture and video outputs should consider the device orientation or not ([#497][497])
- Improvement: improved Camera2 stability and various bugs fixed (e.g. [#501][501])
- Improvement: improved video snapshots speed, quality and stability ([#506][506])

<https://github.com/natario1/CameraView/compare/v2.0.0-beta06...v2.0.0-rc1>

##### v2.0.0-beta06

- New: Full featured Camera2 integration! Use `cameraExperimental="true"` and `cameraEngine="camera2"` to test this out. ([#490][490])
- Improvement: we now choose a video recording profile that is compatible with the chosen size. Should fix some video recording issues. ([#477][477])
- Improvement: most internals are now open to be accessed by subclassing. Feel free to open PRs with more protected methods to be overriden. ([#494][494])
- **Breaking change**: some public classes have been moved to different packages. See [table here](../extra/v1-migration-guide#repackaging). ([#482][482])
- **Breaking change**: the listener methods `onFocusStart` and `onFocusEnd` are now called `onAutoFocusStart` and `onAutoFocusEnd`. ([#484][484])
- **Breaking change**: the gesture actions `focus` and `focusWithMarker` have been removed and replaced by `autoFocus`, which shows no marker. ([#484][484])
- New: new API called `setAutoFocusMarker()` lets you choose your own marker. ([#484][484])

If you were using `focus`, just switch to `autoFocus`.

If you were using `focusWithMarker`, you can [add back the old marker](../docs/metering#touch-metering-markers).

<https://github.com/natario1/CameraView/compare/v2.0.0-beta05...v2.0.0-beta06>

##### v2.0.0-beta05

- Fixed `FrameProcessor` freeze and release behavior, was broken ([#431][431])
- New: new api `setAutoFocusResetDelay` to control the delay to reset the focus after autofocus was performed, thanks to [@cneuwirt][cneuwirt] ([#435][435])
- Faster camera preview on layout changes ([#403][403])
- A few bug fixes ([#471][471])

<https://github.com/natario1/CameraView/compare/v2.0.0-beta04...v2.0.0-beta05>

##### v2.0.0-beta04

- Renames setPreviewSize to setPreviewStreamSize (previewSize suggests it is related to the view size but it's not) ([#393][393])
- Added new APIs `setSnapshotMaxWidth` and `setSnapshotMaxHeight` ([#393][393]). You can now have a good looking preview but still take low-res snapshots using these snapshot constraints. Before this, the two sizes were coupled.

<https://github.com/natario1/CameraView/compare/v2.0.0-beta03...v2.0.0-beta04>

##### v2.0.0-beta03

- Fixed a few bugs ([#392][392])
- Important fixes to video snapshot recording ([#374][374])

<https://github.com/natario1/CameraView/compare/v2.0.0-beta02...v2.0.0-beta03>

##### v2.0.0-beta02

- Fixed important bugs ([#356][356])
- Picture snapshots are now flipped when front camera is used ([#360][360])
- Added `PictureResult.getFacing()` and `VideoResult.getFacing()` ([#360][360])

<https://github.com/natario1/CameraView/compare/v2.0.0-beta01...v2.0.0-beta02>

### v2.0.0-beta01

This is the first beta release. For changes with respect to v1, please take a look at the [migration guide](../extra/v1-migration-guide).

##### v1.6.1

This is the last release before v2.

- Fixed: crash when using TextureView in API 28, thanks to [@Keyrillanskiy][Keyrillanskiy] ([#297][297])
- Fixed: restore Frame Processor callbacks after taking videos, thanks to [@stefanJi][stefanJi] ([#344][344])
- Enhancement: when horizontal, camera now uses the last available orientation, thanks to [@aartikov][aartikov] ([#290][290])
- Changed: we now swallow exceptions during autoFocus that were happening unpredictably on some devices, thanks to [@mahdi-ninja][mahdi-ninja] ([#332][332])

<https://github.com/natario1/CameraView/compare/v1.6.0...v1.6.1>

### v1.6.0

- Lifecycle support. Use `setLifecycleOwner` instead of calling start, stop and destroy ([#265][265])
- Enhancement: provide synchronous version of CameraUtils.decodeBitmap thanks to [@athornz][athornz] ([#224][224])
- Enhancement: prevent possible context leak thanks to [@MatFl][MatFl] ([#245][245])
- Bug: fix crash when using default VideoCodec thanks to [@Namazed][Namazed] ([#264][264])
- Enhancement: CameraException.getReason() gives some insight about the error ([#265][265])
- Enhancement: Common crashes are now being posted to the error callback instead of crashing the app ([#265][265])

<https://github.com/natario1/CameraView/compare/v1.5.1...v1.6.0>

##### v1.5.1

- Bug: byte array length for Frames was incorrect thanks to [@ssakhavi][ssakhavi] ([#205][205])
- Bug: gestures were crashing in some conditions ([#222][222])
- Bug: import correctly the ExifInterface library ([#222][222])
- Updated dependencies thanks to [@caleb-allen][caleb-allen] ([#190][190])

<https://github.com/natario1/CameraView/compare/v1.5.0...v1.5.1>

### v1.5.0

- New: set encoder for video recordings with `cameraVideoCodec` ([#174][174])
- New: set max duration for videos with `cameraVideoMaxDuration` ([#172][172])
- Enhancement: reduced lag with continuous gestures (ev, zoom) ([#170][170])
- Bug: tap to focus was crashing on some devices ([#167][167])
- Bug: capturePicture was breaking if followed by another event soon after ([#173][173])

<https://github.com/natario1/CameraView/compare/v1.4.2...v1.5.0>

##### v1.4.2

- Add prefix to XML resources so they don't collide, thanks to [@RocketRider][RocketRider] ([#162][162])
- Add `videoMaxSize` API and XML attribute, to set max size video in bytes, thanks to [@chaitanyaraghav][chaitanyaraghav] ([#104][104])
- Improved the preview size selection, thanks to [@YeungKC][YeungKC] ([#133][133])
- Improved the playSounds attribute, was playing incorrectly, thanks to [@xp-vit][xp-vit] ([#143][143])

<https://github.com/natario1/CameraView/compare/v1.4.1...v1.4.2>

##### v1.4.1

- Fixed a bug that would flip the front camera preview on some devices ([#112][112])
- Two new `CameraOptions` APIs: `o.getSupportedPictureSizes()` and `o.getSupportedPictureAspectRatios()` ([#101][101])
- Most controls (video quality, hdr, grid, session type, audio, white balance, flash, facing) now inherit
  from a base `Control` class ([#105][105]). This let us add new APIs:

  - `CameraView.set(Control)`: sets the control to the given value, e.g. `set(Flash.AUTO)`
  - `CameraOptions.supports(Control)`: returns true if the control is supported
  - `CameraOptions.getSupportedControls(Class<? extends Control>)`: returns list of supported controls of a given kind

<https://github.com/natario1/CameraView/compare/v1.4.0...v1.4.1>

### v1.4.0

- CameraView is now completely thread-safe. All actions are asynchronous. ([#97][97])
  This has some breaking drawbacks. Specifically, the `get` methods (e.g., `getWhiteBalance`) might
  not return the correct value while it is being changed. So don't trust them right after you have changed the value.
  Instead, always check the `CameraOptions` to see if the value you want is supported.
- Added error handling ([#97][97]) in `CameraListener.onCameraError(CameraException)`.
  At the moment, all exceptions there are unrecoverable. When the method is called, the camera is showing
  a black preview. This is a good moment to show an error dialog to the user.
  You can also try to `start()` again but that is not guaranteed to work.
- Long requested ability to set the picture output size ([#99][99]). Can be done through
  `CameraView.setPictureSize()` or through new XML attributes starting with `cameraPictureSize`.
  Please refer to docs about it.
- Deprecated `toggleFacing`. It was unreliable and will be removed.
- Deprecated `getCaptureSize`. Use `getPictureSize` instead.
- Fixed bugs.

<https://github.com/natario1/CameraView/compare/v1.3.2...v1.4.0>

##### v1.3.2

- Fixed a memory leak thanks to [@andrewmunn][andrewmunn] ([#92][92])
- Reduced memory usage when using cropOutput thanks to [@RobertoMorelos][RobertoMorelos] ([#93][93])
- Improved efficiency for Frame processors, recycle buffers and Frames ([#94][94])

<https://github.com/natario1/CameraView/compare/v1.3.1...v1.3.2>

##### v1.3.1

- Fixed a bug that would make setFacing and other APIs freeze the camera ([#86][86])
- Fixed ConcurrentModificationExceptions during CameraListener callbacks ([#88][88])

<https://github.com/natario1/CameraView/compare/v1.3.0...v1.3.1>

### v1.3.0

- Ability to inject frame processors to do your own visual tasks (barcodes, facial recognition etc.) ([#82][82])
- Ability to inject external loggers (e.g. Crashlytics) to listen for internal logging events ([#80][80])
- Improved CameraUtils.decodeBitmap, you can now pass maxWidth and maxHeight to avoid OOM ([#83][83])
- Updated dependencies thanks to [@v-gar][v-gar] ([#73][73])

<https://github.com/natario1/CameraView/compare/v1.2.3...v1.3.0>

[aartikov]: https://github.com/aartikov
[athornz]: https://github.com/athornz
[v-gar]: https://github.com/v-gar
[andrewmunn]: https://github.com/andrewmunn
[chaitanyaraghav]: https://github.com/chaitanyaraghav
[YeungKC]: https://github.com/YeungKC
[RobertoMorelos]: https://github.com/RobertoMorelos
[RocketRider]: https://github.com/RocketRider
[xp-vit]: https://github.com/xp-vit
[caleb-allen]: https://github.com/caleb-allen
[ssakhavi]: https://github.com/ssakhavi
[MatFl]: https://github.com/MatFl
[Namazed]: https://github.com/Namazed
[Keyrillanskiy]: https://github.com/Keyrillanskiy
[mahdi-ninja]: https://github.com/mahdi-ninja
[stefanJi]: https://github.com/stefanJi
[cneuwirt]: https://github.com/cneuwirt
[agrawalsuneet]: https://github.com/agrawalsuneet
[RAN3000]: https://github.com/RAN3000
[vaibhavbhandula]: https://github.com/vaibhavbhandula
[sewar]: https://github.com/sewar


[73]: https://github.com/natario1/CameraView/pull/73
[80]: https://github.com/natario1/CameraView/pull/80
[82]: https://github.com/natario1/CameraView/pull/82
[83]: https://github.com/natario1/CameraView/pull/83
[86]: https://github.com/natario1/CameraView/pull/86
[88]: https://github.com/natario1/CameraView/pull/88
[92]: https://github.com/natario1/CameraView/pull/92
[93]: https://github.com/natario1/CameraView/pull/93
[94]: https://github.com/natario1/CameraView/pull/94
[97]: https://github.com/natario1/CameraView/pull/97
[99]: https://github.com/natario1/CameraView/pull/99
[101]: https://github.com/natario1/CameraView/pull/101
[104]: https://github.com/natario1/CameraView/pull/104
[105]: https://github.com/natario1/CameraView/pull/105
[112]: https://github.com/natario1/CameraView/pull/112
[133]: https://github.com/natario1/CameraView/pull/133
[143]: https://github.com/natario1/CameraView/pull/143
[162]: https://github.com/natario1/CameraView/pull/162
[167]: https://github.com/natario1/CameraView/pull/167
[170]: https://github.com/natario1/CameraView/pull/170
[172]: https://github.com/natario1/CameraView/pull/172
[173]: https://github.com/natario1/CameraView/pull/173
[174]: https://github.com/natario1/CameraView/pull/174
[190]: https://github.com/natario1/CameraView/pull/190
[205]: https://github.com/natario1/CameraView/pull/205
[222]: https://github.com/natario1/CameraView/pull/222
[224]: https://github.com/natario1/CameraView/pull/224
[245]: https://github.com/natario1/CameraView/pull/245
[264]: https://github.com/natario1/CameraView/pull/264
[265]: https://github.com/natario1/CameraView/pull/265
[290]: https://github.com/natario1/CameraView/pull/290
[297]: https://github.com/natario1/CameraView/pull/297
[332]: https://github.com/natario1/CameraView/pull/332
[344]: https://github.com/natario1/CameraView/pull/344
[356]: https://github.com/natario1/CameraView/pull/356
[360]: https://github.com/natario1/CameraView/pull/360
[374]: https://github.com/natario1/CameraView/pull/374
[392]: https://github.com/natario1/CameraView/pull/392
[393]: https://github.com/natario1/CameraView/pull/393
[471]: https://github.com/natario1/CameraView/pull/471
[431]: https://github.com/natario1/CameraView/pull/431
[403]: https://github.com/natario1/CameraView/pull/403
[421]: https://github.com/natario1/CameraView/pull/421
[435]: https://github.com/natario1/CameraView/pull/435
[477]: https://github.com/natario1/CameraView/pull/477
[482]: https://github.com/natario1/CameraView/pull/482
[484]: https://github.com/natario1/CameraView/pull/484
[490]: https://github.com/natario1/CameraView/pull/490
[497]: https://github.com/natario1/CameraView/pull/497
[498]: https://github.com/natario1/CameraView/pull/498
[501]: https://github.com/natario1/CameraView/pull/501
[502]: https://github.com/natario1/CameraView/pull/502
[506]: https://github.com/natario1/CameraView/pull/506
[513]: https://github.com/natario1/CameraView/pull/513
[517]: https://github.com/natario1/CameraView/pull/517
[521]: https://github.com/natario1/CameraView/pull/521
[527]: https://github.com/natario1/CameraView/pull/527
[528]: https://github.com/natario1/CameraView/pull/528
[530]: https://github.com/natario1/CameraView/pull/530
[535]: https://github.com/natario1/CameraView/pull/535
[537]: https://github.com/natario1/CameraView/pull/537
[545]: https://github.com/natario1/CameraView/pull/545
[551]: https://github.com/natario1/CameraView/pull/551
[552]: https://github.com/natario1/CameraView/pull/552
[559]: https://github.com/natario1/CameraView/pull/559
[564]: https://github.com/natario1/CameraView/pull/564
[572]: https://github.com/natario1/CameraView/pull/572
[574]: https://github.com/natario1/CameraView/pull/574
[580]: https://github.com/natario1/CameraView/pull/580
[588]: https://github.com/natario1/CameraView/pull/588
[617]: https://github.com/natario1/CameraView/pull/617
[630]: https://github.com/natario1/CameraView/pull/630
[632]: https://github.com/natario1/CameraView/pull/632
[651]: https://github.com/natario1/CameraView/pull/651
[653]: https://github.com/natario1/CameraView/pull/653
[661]: https://github.com/natario1/CameraView/pull/661
[691]: https://github.com/natario1/CameraView/pull/691
[696]: https://github.com/natario1/CameraView/pull/696
[697]: https://github.com/natario1/CameraView/pull/697
[704]: https://github.com/natario1/CameraView/pull/704
[716]: https://github.com/natario1/CameraView/pull/716
[718]: https://github.com/natario1/CameraView/pull/718
[724]: https://github.com/natario1/CameraView/pull/724
[732]: https://github.com/natario1/CameraView/pull/732
[741]: https://github.com/natario1/CameraView/pull/741
