Bảng 3.1 : Dòng truyền tải Cú pháp Số bit MPEG_transport_stream() { do { transport_packet() } while (nextbits() = = sync_byte) }
Bảng 3.2: Cấu trúc gói truyền tải
Cú pháp Số bit transport_packet(){ sync_byte transport_error_indicator payload_unit_start_indicator transport_priority PID transport_scrambling_control adaptation_field_control continuity_counter if(adaptation_field_control = = '10' || adaptation_field_control = = '11'){ adaptation_field() } if(adaptation_field_control = = '01' || adaptation_field_control = = '11') { for (i = 0; i < N ; i++){ data_byte } } } 8 1 1 1 13 2 2 4 8
1. Byte đồng bộ (Sync Byte): byte này được nhận biết bởi bộ giải mã. Byte này được cố định giá trị là 0x47.
2. Chỉ thị lỗi truyền tải (Transport Error Indication) : Có độ dài 1bit .Chỉ thị này thông báo khi tỉ lệ lỗi bít BER vượt quá giá trị cho phép. Khi giá trị này được đặt là ‘1’ nó chỉ thị rằng có ít nhất 1 lỗi không thể sửa được trong gói truyền tải, và sẽ không thể đặt lại thành giá trị ‘0’ chừng nào mà các lỗi chưa được sửa hết.
3. Chỉ thị bắt đầu đơn vị dữ liệu (Payload Unit Start Indicator): trường cờ 1 bit mang thông tin về gói PES hoặc dữ liệu PSI trong gói truyền tải.
Khi mà phần tải tin của gói truyền tải mang dữ liệu của các gói PES thì bít này có ý nghĩa như sau: bit có giá trị ‘1’ nếu phần payload của gói truyền tải này chứa byte đầu tiên của gói PES, có giá trị ‘0’ nếu không phải như vậy.
Khi mà phần tải tin của gói truyền tải mang dữ liệu PSI thì bit này được đặt là ‘1’ nếu gói này có chứa byte đầu tiên của PSI, nếu không phải vậy thì bit này sẽ có giá trị ‘0’.
Khi đây là gói trống (null packet) thì bit này được đặt là ‘0’
4. Ưu tiên truyền tải (Transport Priority): Khi được đặt là ‘1’, bit này chỉ thị rằng gói này có độ ưu tiên cao hơn các gói khác có cùng PID mà bit này có giá trị ‘0’. Cơ chế này cho phép xác lập mức ưu tiên của dữ liệu trong bản thân một dòng cơ sở. Phụ thuộc từng ứng dụng mà trường này có thể được mã hóa theo cách không cần quan tâm đến các PID hay là chỉ xét trong 1 PID duy nhất. Trường này thì có thể bị thay đổi bởi bộ mã hóa hoặc giải mã của tùy từng kênh truyền.
5. Nhận dạng gói (Packet Identification - PID): trường 13-bit chỉ ra loại dữ liệu chứa trong phần tải tin. Sau đây là bảng các giá trị PID
Giá trị Mô tả
0x0001 Bảng truy nhập có điều kiện (Conditional Access Table) 0x0002 Transport Stream Description Table
0x0003 - 0x000F Dự phòng 0x00010 … 0x1FFE
Có thể được gán cho network_PID, Program_map_PID, elementary_PID hoặc các mục đích khác.
0x1FFF Gói rỗng (Null packet)
6. Điều khiển đảo mã truyền tải (Transport Scrambling Control): trường 2-bit chỉ ra kiểu xáo trộn dữ liệu trong tải tin của gói truyền tải. Phần tiêu đề (header) và phần thích nghi (adaptation field) trên thực tế không được xáo trộn. Trong trường hợp gói rỗng giá trị của trường này được đặt là ‘00’. Sau đây là bảng giá trị của trường này:
Giá trị Mô tả
00 Không xáo trộn
01 Dự phòng
10 Bị xáo trộn bởi khóa ‘chẵn’ 11 Bị xáo trộn bởi khóa ‘lẻ’
7. Điều khiển trường thích nghi (Adaptation Field Control): cho biết thông tin về trường thích nghi (Adaptation Field):
Giá trị Mô tả
00 Dự phòng
01 Không có trường thích nghi, chỉ có payload 10 Chỉ có trường thích nghi, không có payload 11 Có trường thích nghi, sau đó là payload
8. Bộ đếm liên tục (Continuity Counter): đây là bộ đếm 4-bit, đếm các gói có cùng PID. Khi đạt giá trị lớn nhất (0xF) thì sẽ quay về 0. Bộ đếm này sẽ không thực hiện đếm nếu giá trị của Adaptation Field Control là ‘00’ hoặc ‘10’.
Trong dòng truyền tải, một gói có thể được gửi thành hai lần. Trong đó gói thứ hai là bản sao của gói thứ nhất (duplicate packet). Trong trường hợp này thì giá trị của bộ đếm liên tục sẽ không tăng. Hai gói này sẽ có các byte tương ứng giống nhau y hệt trừ giá trị
của trường chuẩn đồng hồ chương trình (program clock reference) nếu có thì sẽ được thay bằng giá trị thích hợp.
Giá trị này được tăng lên 1 đơn vị so với giá trị trong gói truyền tải trước đó mà có cùng giá trị PID, hoặc không tăng trong trường hợp trường Adaptation Field Control có giá trị là ‘00’ hoặc ‘10’ như đã mô tả ở trên. Bộ đếm này có thể bị gián đoạn nếu giá trị của trường chỉ thị bất liên tục (discontinuity indicator) được đặt là “1”. Trong trường hợp gói rỗng, giá trị của Continuity Counter chưa được định nghĩa.
9. Byte dữ liệu (data byte): Đây là những byte mang dữ liệu của các gói PES, thông tin của PSI, của các byte dữ liệu riêng (private data) hoặc các byte đệm. Trong trường hợp gói rỗng (gói có PID bằng 0x1FFF) thì byte dữ liệu có thể mang bất kì giá trị nào. Số byte dữ liệu N bằng 184 trừ đi số byte của trường thích nghi được mô tả ngay sau đây.
Bảng 3.3: Trường thích nghi Cú pháp Số bit adaptation_field() { adaptation_field_length if (adaptation_field_length > 0) { discontinuity_indicator random_access_indicator elementary_stream_priority_indicator PCR_flag OPCR_flag splicing_point_flag transport_private_data_flag adaptation_field_extension_flag if (PCR_flag = = '1') { program_clock_reference_base reserved program_clock_reference_extension } if (OPCR_flag = = '1') { original_program_clock_reference_base reserved original_program_clock_reference_extension } if (splicing_point_flag = = '1') { splice_countdown } if (transport_private_data_flag = = '1') { transport_private_data_length
for (i = 0; i < transport_private_data_length; i++) {
private_data_byte } } 8 1 1 1 1 1 1 1 1 33 6 9 33 6 9 8 8 8
if (adaptation_field_extension_flag = = '1') { adaptation_field_extension_length ltw_flag piecewise_rate_flag seamless_splice_flag reserved if (ltw_flag = = '1') { ltw_valid_flag ltw_offset } if (piecewise_rate_flag = = '1') { reserved piecewise_rate } if (seamless_splice_flag = = '1') { splice_type DTS_next_AU[32..30] marker_bit DTS_next_AU[29..15] marker_bit DTS_next_AU[14..0] marker_bit } for (i = 0; i < N; i++) { reserved } } for (i = 0; i < N; i++) { stuffing_byte } } } 8 1 1 1 5 1 15 2 22 4 3 1 15 1 15 1 8 8
10.1. Độ dài trường thích nghi (Adaptation Field Length): trường 8-bit chỉ thị có bao nhiêu byte trong trường thích nghi đi ngay sau trường này. Giá trị độ dài trường thích nghi bằng ‘0’ có nghĩa là chèn thêm 1 byte đệm vào gói truyền tải. Khi giá trị của trường điều khiển trường thích nghi (Adaptation Field Control) là ‘11’, có nghĩa là trong gói truyền tải có cả trường thích nghi và có cả phần tải tin, thì giá trị của trường này sẽ trong khoảng 0-182. Khi giá trị của Adaptation Field Control là ‘10’, nghĩa là trong gói truyền tải chỉ có trường thích nghi không có phần tải tin,giá trị của trường này sẽ là 183. Khi mà dòng truyền tải mang gói PES thì việc chèn byte đệm là cần thiết khi mà kích thước của phần gói PES cần gửi đi không đủ để làm đầy một gói truyền tải vốn được định sẵn là có kích thước cố định. Trường hợp này sẽ được giải quyết bằng cách đặt giá trị của trường độ dài trường thích nghi nhiều hơn phần dữ liệu mà thực sự nó có sao cho phần còn lại vừa đủ để chứa dữ liệu của gói PES. Phần dư ra trong trường thích nghi sẽ được đặt vào đó bằng các byte đệm (stuffing byte).Phương pháp này cho phép dòng truyền tải có thể vận chuyển các gói PES có độ dài thay đổi.
10.2. Chỉ thị không liên tục (Discontinuity Indicator): trường 1 bit chỉ thị sự không liên tục của gói truyền tải hiện tại. Có giá trị ‘1’ nếu mà không liên tục. Chỉ thị này cho biết hoặc là đồng hồ chuẩn (system time-base) hoặc bộ đếm liên tục (Continuity Counter) không liên tục.
10.3. Chỉ thị truy cập ngẫu nhiên (Random Access Indicator): trường 1-bit chỉ thị rằng gói truyền tải hiện tại, hoặc có thể các gói sau nữa mà có cùng PID, có chứa dữ liệu với chức năng như một điểm truy cập ngẫu nhiên. Chính xác là khi trường này được đặt là ‘1’ thì gói PES tiếp theo được mang trong gói truyền tải có cùng chỉ số PID hiện tại sẽ chứa byte đầu tiên của tiêu đề chuỗi video (trong trường hợp dòng cơ sở là dòng cơ sở video) hoặc sẽ chứa byte đầu tiên của một khung audio (trong trường hợp dòng cơ sở là audio). Đồng thời trong gói PES đó cũng sẽ mang nhãn thời gian trình diễn PTS của dữ liệu tương ứng.
10.4. Chỉ thị ưu tiên dòng cơ sở (Elementary Stream Priority Indicator): Chỉ thị mức ưu tiên của dòng dữ liệu. Giá trị ‘1’ chỉ thị gói có mức ưu tiên cao hơn gói có giá trị ‘0’. Trong trường hợp gói truyền tải mang dữ liệu hình ảnh thì trường này chỉ được đặt là ‘1’ nếu gói truyền tải này mang thông tin của ảnh I (intra-coded picture).
10.5.1. PCR-flag: cờ 1-bit. Giá trị là ‘1’ cho biết có sự có mặt của chuẩn đồng hồ chương trình (Program Clock Reference).
10.5.2. OPCR-flag: cờ 1-bit. Giá trị là ‘1’ cho biết sự có mặt của đồng hồ chương trình gốc (Original Program Clock Reference).
10.5.3. Splicing Point Flag: Cờ hiệu điểm ghép nối độ dài 1bit, chỉ ra sự có mặt của trường đếm ngược điểm ghép nối (Splice Countdown).
10.5.4. Transport Private Data Flag: cờ 1 bit. Có giá trị ‘1’ nếu trong trường thích nghi có chứa một hoặc nhiều hơn một byte dữ liệu cá nhân (private data byte), có giá trị ‘0’ nếu không chứa byte nào.
10.5.5. Adaptation Field Extension Flag: cờ 1bit chỉ sự có mặt của phần mở rộng của trường thích nghi. Có giá trị ‘1’ nếu có phần mở rộng này, có giá trị ‘0’ nếu không có.
10.6. Trường tùy chọn (Optional Field): Bao gồm:
10.6.1. PCR (Program Clock Reference): có 48-bit. Đây là chuẩn đồng hồ chương trình được dùng để đồng bộ quá trình giải mã hệ thống. Trường này có thể được sửa đổi trong quá trình truyền (PCR được truyển tổi thiểu 1 lần/100 ms).
Trường này được mã hóa thành 2 phần. Phần thứ nhất là trường 33-bit ‘program clock reference base’. Phần thứ hai là trường 9-bit ‘program clock reference extension’. Các trường này có giá trị tính theo công thức sau:
PCR(i) = PCR_base(i) × 300 + PCR_ext(i)
PCR_base(i) = ((system_clock_ frequency × t(i)) DIV 300) % 233
PCR_ext(i) = ((system_clock_ frequency × t(i)) DIV 1) % 300 Trong đó:
t(i) là thời gian byte thứ i của dòng truyền tải tới bộ giải mã. DIV là phép chia làm tròn về hướng âm vô cùng.
% là toán tử lấy phần dư
6-bit còn lại của trường này được dùng để dự phòng.
10.6.2. OPRC (Original Program Clock Reference): có 48-bit. Đây là chuẩn đồng hồ chương trình gốc, không được sửa đổi trong quá trình truyền, chỉ có thể sử dụng để ghi và phát lại chương trình đơn.
Trường này cũng được mã hóa thành 2 phần tương ứng với trường PCR. Nó cũng gồm có phần cơ sở (original program clock reference base) và phần mở rộng
(original program clock reference extension). Sự có mặt của trường này được quyết định bởi cờ OPCR (OPCR flag). Trường này chỉ được mã hóa ở những gói truyền tải mà có mặt của trường PCR. Trường này được cho phép ở cả dòng truyền tải đơn chương trình và đa chương trình.
Trường OPCR giúp cho việc tái tạo lại một dòng truyền tải đơn chương trình từ một dòng truyền tải khác. Khi tái tạo lại một chương trình đơn, trường OPCR có thể được sao chép thành trường PCR. Chỉ khi nào toàn bộ một dòng truyền tải đơn chương trình được tái tạo lại hoàn chỉnh thì giá trị PCR này mới được coi là hợp lệ. Trong trường hợp có ít nhất một gói PSI hoặc gói dữ liệu cá nhân (private data packets) nào đó trong dòng chương trình đơn gốc này thì có thể sẽ cần một sự sắp xếp nào khác nữa mang tính cá nhân. Điều này cũng có nghĩa là trường OPCR phải là một bản sao nguyên gốc của trường PCR trong dòng truyền tải đơn chương trình tương ứng.
Trường OPRC được tính theo công thức sau:
OPCR(i) = OPCR_base(i) × 300 + OPCR_ext(i) trong đó:
OPCR_base(i) = ((system_clock_ frequency × t(i)) DIV 300) % 233
OPCR_ext(i) = ((system_clock_ frequency × t(i)) DIV 1) % 300 t(i) là thời gian byte thứ i của dòng truyền tải tới bộ giải mã.
DIV là phép chia làm tròn về hướng âm vô cùng. % là toán tử lấy phần dư
Trường OPCR sẽ được bỏ qua tại bộ giải mã. Và trường này thì không thể bị thay đổi bởi bất kì bộ ghép kênh hoặc bộ giải mã nào.
10.6.3. Trường đếm lùi điểm ghép nối (Splice Countdown): chiếm 8-bit. Trường này chỉ thị số gói truyền tải (TS Packet) còn lại cho đến khi gặp điểm nối (Splice Point).
Đây là trường 8-bit mô tả một giá trị có thể là dương hoặc âm. Một giá trị dương sẽ mang ý nghĩa là còn bao nhiêu gói truyền tải nữa (mà có cùng chỉ số PID) thì sẽ tới điểm nối (splicing point). Những gói truyền tải kiểu bản sao (duplicate packet) hoặc gói truyền tải mà chỉ chứa trường tùy chọn sẽ bị loại trừ. Điểm nối được định vị ngay tại vị trí sau byte cuối cùng của gói truyền tải mà có giá trị trường này bằng 0. Byte cuối cùng trong phần payload của gói truyền tải này sẽ chứa byte
cuối cùng của một khung audio hoặc một hình đã được mã hóa. Những gói truyền tải có cùng chỉ số PID sau đó có thể chứa đựng dữ liệu từ một dòng cơ sở khác cùng loại.
Phần payload của gói truyền tải tiếp theo mà có cùng PID sẽ bắt đầu bằng byte đầu tiên của một gói cơ sở đóng gói (PES packet). Trong trường hợp dữ liệu âm thanh, phần payload của gói PES sẽ bắt đầu bằng một điểm truy cập (an access point). Trong trường hợp dữ liệu hình ảnh, phần payload của gói PES sẽ bắt đầu bằng một điểm truy cập, hoặc một mã kết thúc chuỗi (sequence end code) theo sau đó là một điểm truy cập. Sau điểm nối có thể vẫn còn trường đếm lùi điểm ghép nối. Khi ấy giá trị của trường này là một giá trị âm ‘–n’ nó chỉ ra rằng gói truyền tải này là gói thứ n sau điểm nối.
Điểm truy cập được định nghĩa như sau:
Với dữ liệu hình: đó là byte đầu tiên của tiêu đề chuỗi hình ảnh (video sequence header).
Với dữ liệu âm thanh: đó là byte đầu tiên của khung âm thanh (audio frame). 10.6.4. Trường dữ liệu riêng truyền tải (Transport Private Data) : chiếm 5 byte.
Byte dữ liệu cá nhân (Private data byte): những byte này không được định trước bởi ITU-T | ISO/IEC mà thay đổi tùy theo người dùng.
Chiều dài dữ liệu cá nhân (transport private data length): trường 8 bit, chỉ ra số byte dữ liệu cá nhân đi ngay sau trường này.
10.6.5. Mở rộng trường thích nghi (Adaptation Field Extention): chiếm 5 byte.
10.6.5.1. Chiều dài mở rộng trường thích nghi (adaptation field extension length): trường 8-bit. Chỉ ra số byte của trường thích nghi mở rộng đi sau trường này (bao gồm cả những byte dự phòng nếu có).
10.6.5.2. ltw_flag (legal time window_flag): trường cờ 1 bit. Khi được đặt giá trị ‘1’ thì có nghĩa là có mặt của trường ltw_offset
10.6.5.3. piecewise_rate_flag: cờ 1 bit, thể hiện sự có mặt hay không của trường piecewise_rate.
10.6.5.4. seamless splice flag: cờ 1 bit. Khi cờ này được đặt giá trị ‘1’ thì sẽ có các trường ‘splice_type’ và ‘DTS_next_AU’. Nếu giá trị của cờ này là ‘0’ thì cả hai trường trên đều không có. Trường này không thể được đặt là ‘1’ trong những gói truyền tải mà cờ ‘splicing point flag’ không được đặt là ‘1’. Khi mà cờ này được đặt
là ‘1’ trong một gói truyền tải mà có chỉ số ‘splice countdown’ là số dương, thì các gói truyền tải tiếp theo có cùng PID cũng sẽ có giá trị cờ này là ‘1’, cho tới khi nào mà gói truyền tải có chỉ số ‘splice countdown’ lùi về đến 0 (bao gồm cả gói truyền tải hiện tại). Khi cờ này được đặt, nếu dòng cơ sở trong đó là dòng dữ liệu âm thanh, thì trường ‘splice type’ sẽ được đặt là ‘0000’. Nếu dòng cơ sở trong đó chứa dữ liệu hình ảnh thì nó phải thỏa mãn những điều kiện đặt ra tùy theo giá trị của trường ‘splice type’
10.6.5.5. ltw_valid_flag (legal time window_valid_flag): trường 1 bit. Khi được đặt là ‘1’ có nghĩa là giá trị của ‘ltw_offset’ là hợp lệ. Còn nếu là ‘0’ có nghĩa là giá trị của trường ‘ltw_offset’ không xác định.
10.6.5.6. ltw_offset (legal time window offset): cửa sổ thời gian hợp lệ, trường 15-bit. Giá trị của trường này chỉ được xác định khi giá trị của cờ ‘ltw_valid’ được đặt là ‘1’. Đơn vị của trường này là 300/fs giây. Trong đó fs là tần số đồng hồ hệ thống. Giá trị của trường được tính theo công thức sau:
offset = t1(i) – t(i) ltw_offset = offset//1
trong đó i là chỉ số của byte đầu tiên của gói truyền tải, ‘offset’ là giá trị được mã hóa ở trường này, t(i) là thời gian đến của byte i ở bộ giải mã (T-STD Transport Stream System Target Decoder), t1(i) là giới hạn trên của khoảng thời gian của cửa sổ thời gian hợp lệ tương ứng với gói truyền tải này.
10.6.5.7. piecewise rate: trường 22-bit. Giá trị của trường này chỉ có ý nghĩa khi mà cả 2 cờ ‘ltw_flag’ và ‘ltw_valid_flag’ được đặt lên ‘1’. Khi ấy, giá trị này là một số ngyên dương chỉ ra một tỉ lệ bit giả thiết là R được sử dụng để định nghĩa cửa sổ thời gian hợp lệ của những gói truyền tải,có cùng chỉ số PID, đi sau gói này nhưng lại không có trường ‘legal time window offset’.