2012-03-08 26 views
8

Tôi đang làm việc trên ứng dụng trình ghi video nhúng của Linux có ghi video định dạng MP4 vào một tệp (trên thẻ SD định dạng FAT).Phương pháp ghi tệp hiệu quả nhất cho máy quay video Linux

Một số yếu tố phức tạp là dữ liệu video và âm thanh đến từ codec phần cứng phải được bảo trì với độ trễ thấp và phải ghi vào bộ đệm có khả năng DMA.

Hiện tại cho tệp đầu ra tôi sử dụng open() và write(), nhưng hãy tìm rằng write() có thể mất hàng trăm mili giây để trở lại khi hệ thống đang được tải, vì vậy ghi của tôi được thực hiện trong một chuỗi riêng biệt .

Khi viết tắt, tôi sao chép dữ liệu từ bộ đệm DMA (nhỏ, hạn chế) sang bộ đệm tròn đa megabyte malloc'd, sau đó viết() từ bộ đệm đó trong chuỗi khác. Điều này có nghĩa là tôi đang làm ít nhất hai bản sao, một lần vào bộ đệm ứng dụng, và một lần vào bộ nhớ cache của bộ đệm hệ thống.

Tôi đang xem xét đang cố gắng O_DIRECT viết để tránh một bản sao, nhưng tôi quan tâm đến bất kỳ nhận xét nào. Tôi lưu ý rằng Robert Love comments that O_DIRECT is terrible nhưng không nói tại sao. Mặt khác, tôi cũng sẽ quan tâm nếu có ai biết cách viết() để không bị trì hoãn trong một khoảng thời gian dài (AIO?), Sau đó tôi có thể sử dụng bộ đệm đệm như Linus dự định.

Câu hỏi này không liên quan đến my very old question about write stalls.

+1

Hiệu suất ghi thẻ SD có thể khác nhau tùy thuộc vào nhà sản xuất, hệ điều hành, kích thước ngành, vv. Có thể bạn đã làm điều này, nhưng bài viết của bạn có được thực hiện trên các ranh giới có kích thước tốt (ví dụ: 64K tại một thời điểm) không? Bạn đã thử phân bổ trước tệp trên thẻ SD với kích thước lớn hơn mức cần thiết sao cho các phần đã được đặt trước trong FAT? – BitBank

+0

@BitBank Tôi thực hiện viết nhị phân nhưng không có prealloc, đã nghĩ đến việc thử. Bạn có một số kinh nghiệm với điều đó? – blueshift

+0

Tôi đọc ở đâu đó về SD ghi sự chậm trễ do phân bổ ngành FAT. – BitBank

Trả lời

2

Nếu đây thực sự là sản phẩm được nhúng trong đó bạn kiểm soát nguồn trình điều khiển, tôi sẽ xem xét kỹ lưỡng bộ nhớ để cho phép quá trình người dùng truy cập cùng bộ nhớ với trình điều khiển thiết bị và tránh tất cả các bản sao đó.

here là một việc thực hiện mẫu bộ nhớ điều khiển được chia sẻ với một quá trình userspace sử dụng mmap.

+0

Quá trình này thực hiện mmap() bộ đệm DMA đến. Bạn có đề xuất sử dụng mmap() cho bên viết thay cho O_DIRECT không? Quan tâm nếu bạn có bất kỳ kinh nghiệm hoặc tài liệu nào về việc sử dụng đó. – blueshift

+0

Về cơ bản, trình điều khiển sẽ sử dụng remap_pfn_range để ánh xạ bộ nhớ của nó cho vùng người dùng. Tôi đã thêm liên kết vào mẫu mà tôi tìm thấy thông qua Google. – idlethread

Các vấn đề liên quan