Bộ mã hóa video MIPS thấp


7

Tôi đang tìm kiếm một MIPS thấp, bộ mã hóa video nén thấp. Đây là mức nén chất lượng 10fps, VGA. Những lựa chọn của tôi là gì? Tôi cần có khả năng thực hiện việc nén này bằng CPU ARM M4 150 MHz với hỗ trợ Điểm nổi. (STM32F4) ..

Ý tưởng của tôi là đẩy dữ liệu nén này ra khỏi CPU bằng một bus song song, sẽ không có xử lý nào được thực hiện trên dữ liệu. Tốc độ nén khôn ngoan, càng nhiều càng tốt, tôi chỉ muốn xem ranh giới. Đây là một ứng dụng camera quan sát giá rẻ, tôi muốn xem những gì tôi có thể đạt được với cpu 5USD và rất nhiều băng tần truyền với bộ mã hóa 30USD với dữ liệu truyền dữ liệu thấp bw.

10 khung hình / giây, VGA sẽ tạo ra dữ liệu khoảng 25Mbit / giây. Đây là tốc độ dữ liệu khá cao cho bất cứ điều gì ngoài đó. Nếu tôi có thể giảm mức này xuống 5Mbit / giây, tôi nghĩ rằng tôi có thể xây dựng một hệ thống camera quan sát có chi phí rất thấp. Khi tôi nhận được dữ liệu về cơ sở, tôi có thể mã hóa lại dữ liệu, do đó không có vấn đề gì với cơ chế nén, miễn là nó không bị mất dữ liệu.

Video đơn sắc là những gì cần thiết tại thời điểm trên màu sắc.

Cập nhật

  • CPU này có 120 MHz được phân bổ cho nhiệm vụ này.
  • Giao diện bộ nhớ là 16 bit, do đó ghi / đọc bộ nhớ ngoài chậm hơn so với bộ nhớ trong.
  • Bộ nhớ trong là 120KByte và nó có quyền truy cập nhanh 32 bit. Cả hai trường hợp bộ nhớ được truy cập thông qua bus AHB mà chúng ta nên giả sử 60 MHz là tần số xung nhịp.
  • Dự kiến ​​luồng dữ liệu sau:
    1. Camera -> DMA -> Bộ nhớ ngoài (không có sự tham gia của cpu)
    2. Bộ nhớ ngoài -> CPU -> Nén -> Bộ nhớ trong
    3. Bộ nhớ trong -> DMA -> Bus dữ liệu -> Thiết bị ngoài

CPU sẽ chỉ đọc một đoạn nén dữ liệu và ghi vào bộ nhớ trong của nó (dữ liệu đã nén), sau đó bắt đầu truyền DMA.


Bao nhiêu bộ xử lý của bạn có thể đủ khả năng để dành cho việc này? Và tỷ lệ nén chấp nhận được là gì; 5x, 2x, ít hơn thế?
Martin Thompson

Tôi có thể dành 80-90%. Ý tưởng của tôi là đẩy dữ liệu nén này ra khỏi CPU bằng một bus song song, sẽ không có xử lý nào được thực hiện trên dữ liệu. Tốc độ nén khôn ngoan, càng nhiều càng tốt, tôi chỉ muốn xem ranh giới. Đây là một ứng dụng camera quan sát giá rẻ, tôi muốn xem những gì tôi có thể đạt được với cpu 5USD và rất nhiều băng tần truyền với bộ mã hóa 30USD với dữ liệu truyền dữ liệu thấp bw.
Ktuncer

Chỉ cần thêm: 10 khung hình / giây, VGA sẽ tạo ra dữ liệu khoảng 25Mbit / giây. Đây là tốc độ dữ liệu khá cao cho bất cứ điều gì ngoài đó. Nếu tôi có thể giảm mức này xuống 5Mbit / giây, tôi nghĩ rằng tôi có thể xây dựng một hệ thống camera quan sát có chi phí rất thấp. Khi tôi nhận được dữ liệu về cơ sở, tôi có thể mã hóa lại dữ liệu, do đó không có vấn đề gì với cơ chế nén, miễn là nó không bị mất dữ liệu.
Ktuncer

như bạn đề cập đến bảo mật ... Màu sắc hay đơn sắc?
Martin Thompson

Mono là những gì cần thiết tại thời điểm này. Điều đó làm cho một sự khác biệt?
Ktuncer

Câu trả lời:


2

1. Phân loại xem bạn cần MIPS thấp hay tổng thể có độ phức tạp thấp
Hãy để tôi có một sự tự do nhỏ để chia vấn đề này thành hai phần.

  1. Mã hóa có độ phức tạp thấp - cho phép các tài nguyên thấp hơn (đặc biệt là trong bộ nhớ) giúp mã hóa đáp ứng nhanh trong hệ thống nhất định.
  2. Rõ ràng thấp trong tính toán (MIPS). - chỉ liên quan đến chu kỳ CPU tối thiểu có thể.

Có tiêu chí thứ ba - trong đó mọi người nói về "Độ trễ thấp" - cho ứng dụng như Hội nghị truyền hình trong đó tài nguyên tính toán có thể không đáng lo ngại - nhưng độ trễ chung được giới thiệu bởi mã hóa

Điều quan trọng cần lưu ý là trong các hệ thống có độ phức tạp thấp hơn - truy cập vào bộ nhớ (tốc độ và độ rộng của bộ nhớ) và đôi khi IO thường cực kỳ chậm, đó là lý do tại sao lớp thuật toán MPEG bị ảnh hưởng mặc dù thuật toán tính toán có thể đơn giản.

Trước khi bạn đưa ra đánh giá về yêu cầu về tiền mã hóa - bạn nên cố gắng tạo ngân sách theo -

a. Chu kỳ CPU mỗi giây.
b. Bộ nhớ tối đa thông qua đặt.
c. Độ trễ IO

2. Bạn nên tùy chỉnh MPEG thay vì phát minh lại
Nói chung - Lớp codec MPEG cung cấp cho bạn một cơ chế rất linh hoạt để thực hiện việc này. Theo nghĩa đó, bạn hoàn toàn không phải phát minh lại codec nhiều như bạn muốn tùy chỉnh MPEG 2 hoặc MPEG 4 để hoàn thành công việc của mình.

Trước hết, hãy nói những gì tất cả các yếu tố có thể nén và sắp xếp chúng theo thứ tự phức tạp:

  1. Dự toán chuyển động và bù chuyển động. 1.a. Dự đoán chuyển tiếp (khung P) 1.b. Dự đoán kép (khung B) 1.c. vectơ chuyển động độ phân giải cao
  2. Mã hóa nội bộ - DCT (+ IDCT)
  3. Qunatization - và lựa chọn chế độ mã hóa
  4. VLC - mã hóa chiều dài thay đổi. (CABAC trong H.264)
  5. Dự đoán đồng hiệu quả [Trong mpeg2 chỉ dự đoán DC- MPEG4 có nhiều hơn]

Trong lớp thuật toán MPEG, mã hóa và VLC dựa trên DCT trở nên bắt buộc khá nhiều mà không có nhiều sự lựa chọn - nhưng phần còn lại của tất cả các cơ chế là rất cần thiết

Ví dụ: Ước tính chuyển động và bù chuyển động là một trong những yếu tố tiêu thụ MIPS cao nhất. Nếu bạn không có tài nguyên để thực hiện việc này - bạn chỉ có thể mã hóa tất cả các khung như khung I (điều này làm cho nó khá giống với MJPEG - nhưng bộ giải mã MPEG tiêu chuẩn có thể giải mã điều này). Nếu bạn có thể chi trả nhiều tài nguyên hơn một chút - bạn có thể thực hiện bù chuyển động tầm thường bằng cách sử dụng Chênh lệch khung hình - thay vì gửi mọi khung hình như Intra, bạn có thể trừ mọi blcok khỏi khối khung trước đó; nếu chênh lệch cao hơn tín hiệu ban đầu, hãy gửi nó dưới dạng Intra.

Tất nhiên - tất cả điều này có nghĩa là bạn sẽ mất đi một số hiệu quả được hứa hẹn bởi bộ mã hóa ở trên - nhưng tôi nghĩ bạn sẵn sàng từ bỏ điều đó!


EDIT:
Bạn có thể xem các codec sau đây là điểm tham chiếu tốt:

  1. MSSG: http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html
    Tốt để hiểu nhưng có thể là chậm nhất trên thế giới.

  2. FFMPEG: http://ffmpeg.org/ Có lẽ là nhanh nhất trên trái đất. Tốt để bắt đầu như hộp đen nhưng đừng cố thay đổi mã từ bên trong. Có thể cung cấp cho bạn các tùy chọn tốt để kiểm soát nội dung khi bạn sử dụng API thư viện. Nó đã được chuyển sang nhiều nền tảng - nhưng thực hiện nó trên một nền tảng mới có thể là một số nhiệm vụ.

  3. FAME: http://fame.sourceforge.net/ Điều này ban đầu được bắt đầu với mục đích giống như bạn mô tả. Mặc dù, tôi hơi mất liên lạc với điều này - nhưng bạn có thể thử nó.

  4. Xvid: http://www.xvid.org/ Đây là MPEG-4. Đây là một trong những sự cân bằng tốt nhất giữa mã sạch và tốc độ hợp lý. Nên dễ dàng nhất để làm việc với nếu bạn kết thúc ở bên trong bộ mã hóa.

  5. JPEG: http://www.ijg.org/ Đây là JPEG. Đây là một trong những thư viện tốt nhất để chuyển nó trên các nền tảng. Ngoài ra, JPEG vốn đã đơn giản hơn một số khía cạnh của MPEG - vì vậy có thể bạn nên thử điều này trước. Hầu hết các máy ảnh trên thế giới có lẽ đã sử dụng thư viện này - thay vì tạo ra thứ gì đó của riêng nó!

Có thể tôi sai khi sử dụng MPEG! Nhưng đó là một loại rủi ro đáng để chấp nhận.

Có lẽ biện pháp tốt nhất để kiểm tra xem điều đó có hiệu quả hay không - chỉ cần thử lấy một DCT tiêu chuẩn 8x8 với lượng tử hóa trên hình ảnh của bạn; tối ưu hóa chỉ này. Nếu bạn có thể đạt được gần với yêu cầu thời gian thực của mình, tôi nghĩ bạn nên làm tất cả các khung hình JPEG hoặc tất cả các khung hình MPEG của tôi. Nếu bạn đang rời khỏi mục tiêu - hơn là không đáng.


Dipan, đây là một câu trả lời tốt tuy nhiên tôi đang tìm kiếm một cái gì đó định lượng hơn một chút. Bạn đang nói, nó phụ thuộc. Chúng tôi biết rằng, tôi đang tìm kiếm một phỏng đoán có giáo dục. Một người có kinh nghiệm về những thứ này có thể nói: "đừng bận tâm với x, hãy tập trung vào Y và đây là bit quan trọng bạn cần để ý. Nếu bạn làm đúng, bạn sẽ có được kiểu nén này, nhiều mips sẽ được dùng". Dựa trên kinh nghiệm của tôi một khi bạn tìm được chàng trai phù hợp, câu trả lời thường là 20% ở khu vực lân cận.
Ktuncer

Trong thực tế, trước tiên tôi cũng đã cố gắng tạo ra một số thông tin chi tiết - nhưng tôi nghĩ rằng nó có thể không phản ánh trực tiếp bởi vì phần cứng của bạn là phần cứng rất cụ thể, nơi điều này cần được phản ánh. Vì vậy, tôi đã giới hạn để cung cấp cho bạn câu trả lời mang tính định hướng hơn là định lượng. Ngoài ra, có lẽ tốt nhất nên lấy đi câu trả lời, điều mà tôi muốn nhấn mạnh là bám sát vào MPEG nổi tiếng và điều chỉnh nó hơn là phát minh lại.
Dipan Mehta

Để hoàn hảo về mặt định lượng, đề nghị của tôi là bạn nên sử dụng một bộ mã hóa MPEG (tham khảo) tốt và bắt đầu định hình nó. Dựa trên những kết quả hồ sơ thực tế đó, tôi có thể hướng dẫn bạn cho đến cuối cùng. tất cả những gì sẽ hoạt động chính xác đối với mã hóa thời gian thực tất cả sẽ phụ thuộc vào những điều cụ thể mà bạn có thể đạt được, trên nền tảng phần cứng của bạn để điều chỉnh cụ thể bộ mã hóa để đáp ứng các ràng buộc thời gian thực. (tất nhiên, điều đó sẽ cần bạn hỏi thêm nhiều câu hỏi nữa!)
Dipan Mehta

Tôi đánh giá cao ý tưởng MPEG của bạn, tất cả iFrames, v.v ... Đây là một cách tiếp cận tốt, tuy nhiên nếu tôi bắt đầu với thông tin này, tôi có thể thấy trong ba tháng là không thể, vì MIPS yêu cầu (ngay cả khi bị giảm nước) nằm ngoài CPU hoặc nén chỉ 10% hoặc đại loại như thế. Tôi cần một số con số, ngay cả khi nó không dành cho nền tảng này.
Ktuncer

Một bộ mã hóa MPEG mã nguồn mở tốt là gì? Một cái gì đó được viết bằng ANSI C, tôi có thể lấy và bắt đầu chơi với.
Ktuncer

4

Vấn đề đầu tiên của bạn là bộ nhớ - ngay cả phiên bản lớn nhất của bộ xử lý đó cũng không có nhiều SRAM bên trong (về mặt video - đó là bộ xử lý nhúng đáng kinh ngạc so với nhiều người!) - khung hình VGA là 300kB, so với 100ishkB trong bộ xử lý . Điều đó có nghĩa là bạn sẽ phải xử lý nó khi nó xuất hiện - nói theo 8 hoặc 16 dòng, điều này làm cho vấn đề trở nên khó khăn hơn nhiều vì thời hạn thực sự ít bị chậm lại.

Không rõ bạn sẽ thu thập dữ liệu như thế nào, nhưng tôi cho rằng bạn sẽ có một số loại DMA từ ADC hoặc một số cổng kỹ thuật số, nếu không bạn sẽ dành một nửa thời gian để xáo trộn dữ liệu!

Nhằm mục đích cho các tỷ lệ nén thấp, bạn có thể chỉ muốn xem xét việc mã hóa các vùng đồng bằng giữa các pixel dọc theo một dòng hoặc một hình vuông 3x3 và sau đó mã số hóa chúng.

Xem thêm Đơn giản, phát trực tuyến, nén hình ảnh không mất dữ liệu - mặc dù tôi đã yêu cầu nén không mất dữ liệu rõ ràng, có thể có một số ý tưởng cho bạn ở đó.

Là một cơ sở dữ liệu, một trong những đồng nghiệp của tôi đã thực hiện nén JPG đơn sắc 320x240 8 bit trong một micro 32 bit 32 MHz với đơn vị điểm nổi và bộ đệm nhỏ. Ông đã sử dụng một số mã tham chiếu (nghĩa là tối ưu hóa cho khả năng đọc, không phải hiệu suất) và có 5 khung hình / giây khá dễ dàng. Tỷ số nén là theo thứ tự của 10x IIRC. Việc chụp ảnh được thực hiện bằng bus phần cứng bên ngoài - làm chủ dữ liệu vào RAM ngoài của micro.


Martin, cảm ơn vì câu trả lời .. Tôi có thể và sẽ thêm bộ nhớ 4Mbit cho bộ xử lý này. Vì vậy, tôi có thể giữ toàn bộ khung hình trong bộ nhớ. Dữ liệu sẽ truyền từ giao diện camera sang bộ nhớ ngoài thông qua DMA, tôi có sự tham gia của zero (hoặc gần bằng 0). Tôi có thể tối ưu hóa phần mã đó khá dễ dàng. Nếu tôi phải, tôi cũng có thể thêm bộ nhớ. Ý tưởng là sử dụng RAM bên trong làm bộ đệm và sử dụng RAM ngoài làm bộ lưu trữ trong khi tôi đang xử lý các khối. Cách tôi nhìn thấy là tôi có 50msec để mã hóa và chuyển dữ liệu ra, tôi có dữ liệu 300KB. Nếu tôi có thể đạt 20fps, thật tuyệt vời.
Ktuncer

1
@Ktuncer: bạn sẽ sử dụng bao nhiêu thời gian để kéo các pixel từ ram bên ngoài và đẩy nó trở lại? Có một DMA giữa bộ nhớ ext & int không?
Martin Thompson

Có .. Tôi sẽ sử dụng DMA từ Camera -> bộ nhớ ngoài, DMA khác sang bộ nhớ ngoài-> bộ nhớ trong.
Ktuncer

Thư viện JPG mã nguồn mở mà Martin đã đề cập được gọi là IJG. Liên kết: ijg.org
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.