2012-01-05 33 views
6

Tôi đã thực hiện bộ giải mã jpeg, nhưng tôi đã không triển khai logic đánh dấu khởi động lại. Đó là lý do tại sao chương trình của tôi không hoạt động trên một số hình ảnh (ví dụ như hình ảnh được lưu với Photoshop: File-> Save As-> jpeg). Tôi muốn triển khai logic đánh dấu khởi động lại, nhưng không có giải thích trực tuyến chi tiết về cách hoạt động của logic đánh dấu khởi động lại. Xin vui lòng bất cứ ai có thể cho tôi biết thêm về khởi động lại đánh dấu, hoặc đề nghị tôi tài nguyên trực tuyến, nơi tôi có thể đọc thêm về nó. Cám ơn!Điểm đánh dấu khởi động lại Jpeg

Trả lời

13

Khởi động lại điểm đánh dấu khá đơn giản. Chúng được thiết kế để cho phép đồng bộ hóa sau một lỗi. Vì hầu hết các hình ảnh JPEG được truyền qua các kênh không có lỗi, chúng hiếm khi cần thiết. Khoảng thời gian khởi động lại được xác định bằng điểm đánh dấu FFDD dưới dạng số 2 byte. Điều này cho biết có bao nhiêu MCU giữa các điểm đánh dấu khởi động lại. Khi bạn gặp dấu khởi động lại (FFD0-FFD7), đặt lại các giá trị DC (Y, Cr, Cb) thành 0 và bitstream được bắt đầu trên một ranh giới byte (sau FFDx). Nó chỉ đơn giản là một vấn đề của đếm thông qua khoảng thời gian khởi động lại hơn và hơn khi bạn giải mã hình ảnh. Các giá trị đánh dấu khởi động lại sẽ tăng từ FFD0 lên FFD7 và sau đó bắt đầu lại ở FFD0. Giá trị điểm đánh dấu chính nó không phải là quan trọng khủng khiếp, nhưng nó có thể chỉ ra nếu khối lớn dữ liệu bị thiếu. Đây là một ví dụ về cách tôi làm điều đó trong bộ giải mã của tôi. Tôi vứt bỏ các dấu hiệu khởi động lại trong trình đọc bitstream của mình.

iRestartCount = iRestartInterval; 
for (y=0; y<Height_in_MCUs; y++) 
    { 
    for (x=0; x<Width_in_MCUs; x++) 
     { 
     <decode an MCU> 
     if (iRestartInterval) // if there is a restart interval defined 
      { 
      if (--iRestartCount == 0) 
      { 
      iRestartCount = iRestartInterval; // reset restart inverval counter 
      iDCPred0 = iDCPred1 = iDCPred2 = 0; // reset DC predictors 
      if (*iBit & 7) // adjust bitstream to start on the next byte boundary 
       { 
       *iBit += (8 - (*iBit & 7)); 
       } 
      } // if restart interval expired 
      } // if restart interval defined 
     } // for x 
    } // for y 

Cập nhật: dấu Restart nay phục vụ cho một mục đích mới - để cho phép mã hóa JPEG và bộ giải mã đa luồng. Vì mỗi "dải" của MCUs có giá trị DC được đặt lại ở đầu mỗi khoảng thời gian khởi động lại và bắt đầu trên một ranh giới byte, mỗi khoảng thời gian khởi động lại có thể được mã hóa độc lập hoặc giải mã bằng một chuỗi khác nhau. Một bộ mã hóa bây giờ có thể tùy ý chia nhiệm vụ thành N luồng và sau đó 'dán' dữ liệu cùng với các dấu khởi động lại. Đối với bộ giải mã, nó không phải là dễ dàng. Nếu có dấu khởi động lại thì mỗi khoảng thời gian có thể được gán cho một luồng khác. Nếu không có mặt, bạn vẫn có thể thực hiện một số thủ thuật giải mã trước để phân chia công việc thành nhiều chuỗi.

+0

Bạn có thể cho tôi biết thêm chi tiết triển khai và logic không? – MrD

+0

nếu nó là một hình ảnh đa thành phần với xen kẽ thì sao? – adikshit

+0

@adikshit - Theo như tôi đã thấy, khoảng thời gian khởi động lại đề cập đến MCUs (đơn vị mã hóa tối thiểu) bất kể cấu hình là gì. Đối với ảnh màu 3 thành phần (Y/Cb/Cr), khoảng thời gian khởi động lại đề cập đến các nhóm gồm 3 khối DCT. Ví dụ, một khoảng 100 sẽ có nghĩa là 300 khối DCT (100 MCUs). – BitBank

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