# ESP_H264 - [](https://components.espressif.com/components/espressif/esp_h264) ESP_H264 is Espressif's lightweight H.264 encoder and decoder component, offering both hardware and software implementations. The hardware encoder (HW encoder) is designed specifically for the esp32p4 chip, achieving a frame rate greater than 30fps for 1080P resolution images. The software encoder (SW encoder) is sourced from v2.2.0 of [openh264](https://github.com/cisco/openh264), while the decoder is obtained from [tinyH264](https://github.com/udevbe/tinyh264). Both the software encoder and decoder are optimized for memory and CPU usage, ensuring optimal performance on Espressif chips. ## Term | Term Abbr | Full Name | Description | | ---------- | ----------------------- | --------------------------------------------------------------------------------------- | | QP | Quantization parameter | The higher the QP, the higher the compression rate and the worse the image quality. | | | | QP is within the range of 0 to 51. | | FPS | Frames per second | It is related to the smoothness of the video. It can be set to 24 in the general video. | | I-frame | Intra frame | Frames that can be encoded without reference to other frames. | | IDR-frame | Instantaneous decoding | Special I frame. | | | refresh frame | Decoder can start decoding at this frame. | | P-frame | Predicted frame | Frames that must be encoded decoded refering to other frames. | | GOP | Group of picture | The sum of one I-frame and number of pictures between two I frames. | | | | GOP is usually set to the number of FPS output by the encoder. | | Resolution | Resolution | It means the width and height of picture. | | MB | Marco block | For picture luma, MB size is 16x16. And for picture chrominance, MB size is 8x8. | | | | `mb_width` = (`width` + 15) >> 4. `mb_height` = (`height` + 15) >> 4 | | Slice | Slice | Multiple macroblocks form a slice | | MV | Motion vector | The horizontal and vertical displacement of the current MB relative | | | | to the best matching MB in the previous frame. | | ROI | Range of interest | The area of interest is in a picture. | | | | This area can be set with different QP to make it clearer or blurrier. | | | | The quantization unit is the size of a luma MB. | | SPS | Sequence parameter set | Required to start decoding. | | PPS | Picture parameter set | Required to start decoding. | | PTS | Presentation time stamp | In baseline profile, the PTS is same as DTS. | | DTS | Decoding time stamp | In baseline profile, the DTS is same as PTS. | | RC | Rate control | The size of the output stream approaching the target stream is controlled. | ## Supported chip | ESP_H264 Version | ESP32-S3 | ESP32-P4 | | ---------------- | --------- | --------- | | v1.1.0 | Supported | Supported | ## Features ### encoder | Feature | HW encoder | SW encoder | | ------------------- | ------------------------------------------------------------------- | ------------------------------------------- | | profile | Support baseline profile | Support baseline profile | | width | Supported range is 80 to 1088. | Supported range is gather than or equal 16. | | height | Supported range is 80 to 2048. | Supported range is gather than or equal 16. | | QP | Supported all | Supported all | | FPS | Supported FPS range is 1 to 255. | Supported FPS range is 1 to 255. | | GOP | Supported GOP range is 1 to 255. | Supported GOP range is 1 to 255. | | SPS | Supported SPS is for all IDR-frame | Supported SPS is for all IDR-frame | | PPS | Supported SPS is for all IDR-frame | Supported SPS is for all IDR-frame | | unencoded data type | Supported ESP_H264_RAW_FMT_O_UYY_E_VYY | Supported ESP_H264_RAW_FMT_YUYV | | | | Supported ESP_H264_RAW_FMT_I420 | | RC | Supported | Supported | | de-blocking filter | Supported | Supported | | Single stream | Supported | Supported | | Dual stream | Each stream supports different parameter configurations except GOP. | Un-supported | | ROI | Supported ROI region number isn't gahter than 8. | Un-supported | | | Each region supports fixed QP or delta QP. | Un-supported | | | Each none region supports delta QP. | Un-supported | | MV | Supported output MV data | Un-supported | ### decoder | Feature | SW decoder | | ------------------------------------------ | -------------------------------------------------------- | | profile | Support constrained baseline profile | | width | Supported range is gather than or equal 16. | | height | Supported range is gather than or equal 16. | | slice group | Support 1 slice group | | QP | Supported all | | FPS | Supported | | GOP | Supported | | SPS | Supported | | PPS | Supported | | unencoded data type | Supported ESP_H264_RAW_FMT_I420 | | long term reference (LTR) frames | Supported | | memory management control operation (MMCO) | Supported | | reference picture list modification | Supported | | dual task decoder | Supported, config task core and priority with menuconfig | ## Performance ### Test on chip ESP32-S3R8 #### SW ENCODER | Resolution | Raw Format | Memory (Byte) | Frame Per Second(fps) | | ---------- | ----------------------- | ------------- | --------------------- | | 320 * 192 | ESP_H264_RAW_FMT_I420 | 1 M | 17.48 | | 320 * 240 | ESP_H264_RAW_FMT_YUYV | 1 M | 11.23 | #### DECODER Note: the memory consumption is strongly depenedent on the resolution of H264 stream and the encoded data. For the **mono task** decoder implementation, the performance is as follows: | Resolution | Raw Format | Memory (Byte) | Frame Per Second(fps) | | ---------- | ----------------------- | ------------- | --------------------- | | 640 * 480 | ESP_H264_RAW_FMT_I420 | 2.5 M | 9 | | 320 * 192 | ESP_H264_RAW_FMT_I420 | 1.0 M | 23 | For the **dual task** decoder implementation, the performance is as follows: | Resolution | Raw Format | Memory (Byte) | Frame Per Second(fps) | | ---------- | ----------------------- | ------------- | --------------------- | | 640 * 480 | ESP_H264_RAW_FMT_I420 | 2.5 M | 11 | | 320 * 192 | ESP_H264_RAW_FMT_I420 | 1.0 M | 27 | ### Test on chip ESP32-P4 #### HW ENCODER | Resolution | Raw Format | Memory (Byte) | Frame Per Second(fps) | | ----------- | ----------------------------- | ------------- | --------------------- | | 1920 * 1080 | ESP_H264_RAW_FMT_O_UYY_E_VYY | 140k | 30 | #### DECODER Note: the memory consumption is strongly depenedent on the resolution of H264 stream and the encoded data. For the **mono task** decoder implementation, the performance is as follows: | Resolution | Raw Format | Memory (Byte) | Frame Per Second(fps) | | ---------- | ----------------------- | ------------- | --------------------- | | 1280 * 720 | ESP_H264_RAW_FMT_I420 | 6.2 M | 7 | | 640 * 480 | ESP_H264_RAW_FMT_I420 | 2.5 M | 25 | For the **dual task** decoder implementation, the performance is as follows: | Resolution | Raw Format | Memory (Byte) | Frame Per Second(fps) | | ---------- | ----------------------- | ------------- | --------------------- | | 1280 * 720 | ESP_H264_RAW_FMT_I420 | 6.2 M | 10 | | 640 * 480 | ESP_H264_RAW_FMT_I420 | 2.5 M | 31 | ## Example Please refer to the files test_apps/esp_h264\_\*\_test.c and test_apps/esp_h264\_\*\_test.h for more details on API usage. ## FAQ 1. Why does build fail when using ESP32-P4? Due to a known compiler issue, ESP32-P4 only supports esp_h264 v1.1.0 on IDF 5.3. This issue will be fixed in a future update. Please switch to IDF 5.3 or use an earlier version of esp_h264 (v1.0.4). If you need to run esp_h264 v1.1.0 on a newer version of IDF, please create an issue in the [esp-adf](https://github.com/espressif/esp-adf/issues) repository to contact us.
84545cd72709104aaffd57bb59848fc9c3a69c4a
idf.py add-dependency "espressif/esp_h264^1.1.0"