mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	esp32_camera_web_server: Improve support for MotionEye (#2777)
This commit is contained in:
		
				
					committed by
					
						 Jesse Hills
						Jesse Hills
					
				
			
			
				
	
			
			
			
						parent
						
							3178243811
						
					
				
				
					commit
					3a72dd5cb6
				
			| @@ -21,12 +21,19 @@ static const char *const TAG = "esp32_camera_web_server"; | |||||||
| #define CONTENT_TYPE "image/jpeg" | #define CONTENT_TYPE "image/jpeg" | ||||||
| #define CONTENT_LENGTH "Content-Length" | #define CONTENT_LENGTH "Content-Length" | ||||||
|  |  | ||||||
| static const char *const STREAM_HEADER = | static const char *const STREAM_HEADER = "HTTP/1.0 200 OK\r\n" | ||||||
|     "HTTP/1.1 200\r\nAccess-Control-Allow-Origin: *\r\nContent-Type: multipart/x-mixed-replace;boundary=" PART_BOUNDARY |                                          "Access-Control-Allow-Origin: *\r\n" | ||||||
|     "\r\n"; |                                          "Connection: close\r\n" | ||||||
| static const char *const STREAM_500 = "HTTP/1.1 500\r\nContent-Type: text/plain\r\n\r\nNo frames send.\r\n"; |                                          "Content-Type: multipart/x-mixed-replace;boundary=" PART_BOUNDARY "\r\n" | ||||||
| static const char *const STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n"; |                                          "\r\n" | ||||||
|  |                                          "--" PART_BOUNDARY "\r\n"; | ||||||
|  | static const char *const STREAM_ERROR = "Content-Type: text/plain\r\n" | ||||||
|  |                                         "\r\n" | ||||||
|  |                                         "No frames send.\r\n" | ||||||
|  |                                         "--" PART_BOUNDARY "\r\n"; | ||||||
| static const char *const STREAM_PART = "Content-Type: " CONTENT_TYPE "\r\n" CONTENT_LENGTH ": %u\r\n\r\n"; | static const char *const STREAM_PART = "Content-Type: " CONTENT_TYPE "\r\n" CONTENT_LENGTH ": %u\r\n\r\n"; | ||||||
|  | static const char *const STREAM_BOUNDARY = "\r\n" | ||||||
|  |                                            "--" PART_BOUNDARY "\r\n"; | ||||||
|  |  | ||||||
| CameraWebServer::CameraWebServer() {} | CameraWebServer::CameraWebServer() {} | ||||||
|  |  | ||||||
| @@ -45,6 +52,7 @@ void CameraWebServer::setup() { | |||||||
|   config.ctrl_port = this->port_; |   config.ctrl_port = this->port_; | ||||||
|   config.max_open_sockets = 1; |   config.max_open_sockets = 1; | ||||||
|   config.backlog_conn = 2; |   config.backlog_conn = 2; | ||||||
|  |   config.lru_purge_enable = true; | ||||||
|  |  | ||||||
|   if (httpd_start(&this->httpd_, &config) != ESP_OK) { |   if (httpd_start(&this->httpd_, &config) != ESP_OK) { | ||||||
|     mark_failed(); |     mark_failed(); | ||||||
| @@ -172,9 +180,6 @@ esp_err_t CameraWebServer::streaming_handler_(struct httpd_req *req) { | |||||||
|       ESP_LOGW(TAG, "STREAM: failed to acquire frame"); |       ESP_LOGW(TAG, "STREAM: failed to acquire frame"); | ||||||
|       res = ESP_FAIL; |       res = ESP_FAIL; | ||||||
|     } |     } | ||||||
|     if (res == ESP_OK) { |  | ||||||
|       res = httpd_send_all(req, STREAM_BOUNDARY, strlen(STREAM_BOUNDARY)); |  | ||||||
|     } |  | ||||||
|     if (res == ESP_OK) { |     if (res == ESP_OK) { | ||||||
|       size_t hlen = snprintf(part_buf, 64, STREAM_PART, image->get_data_length()); |       size_t hlen = snprintf(part_buf, 64, STREAM_PART, image->get_data_length()); | ||||||
|       res = httpd_send_all(req, part_buf, hlen); |       res = httpd_send_all(req, part_buf, hlen); | ||||||
| @@ -182,6 +187,9 @@ esp_err_t CameraWebServer::streaming_handler_(struct httpd_req *req) { | |||||||
|     if (res == ESP_OK) { |     if (res == ESP_OK) { | ||||||
|       res = httpd_send_all(req, (const char *) image->get_data_buffer(), image->get_data_length()); |       res = httpd_send_all(req, (const char *) image->get_data_buffer(), image->get_data_length()); | ||||||
|     } |     } | ||||||
|  |     if (res == ESP_OK) { | ||||||
|  |       res = httpd_send_all(req, STREAM_BOUNDARY, strlen(STREAM_BOUNDARY)); | ||||||
|  |     } | ||||||
|     if (res == ESP_OK) { |     if (res == ESP_OK) { | ||||||
|       frames++; |       frames++; | ||||||
|       int64_t frame_time = millis() - last_frame; |       int64_t frame_time = millis() - last_frame; | ||||||
| @@ -193,7 +201,7 @@ esp_err_t CameraWebServer::streaming_handler_(struct httpd_req *req) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (!frames) { |   if (!frames) { | ||||||
|     res = httpd_send_all(req, STREAM_500, strlen(STREAM_500)); |     res = httpd_send_all(req, STREAM_ERROR, strlen(STREAM_ERROR)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESP_LOGI(TAG, "STREAM: closed. Frames: %u", frames); |   ESP_LOGI(TAG, "STREAM: closed. Frames: %u", frames); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user