1d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber/*
2d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Copyright 2012, The Android Open Source Project
3d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
4d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * you may not use this file except in compliance with the License.
6d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * You may obtain a copy of the License at
7d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
8d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * See the License for the specific language governing permissions and
14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * limitations under the License.
15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber */
16d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
17d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#ifndef TS_PACKETIZER_H_
18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#define TS_PACKETIZER_H_
20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
21d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/ABase.h>
22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <utils/Errors.h>
23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <utils/RefBase.h>
24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <utils/Vector.h>
25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
26d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubernamespace android {
27d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct ABuffer;
29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct AMessage;
30d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Forms the packets of a transport stream given access units.
32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Emits metadata tables (PAT and PMT) and timestamp stream (PCR) based
33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// on flags.
34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct TSPacketizer : public RefBase {
35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    TSPacketizer();
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    // Returns trackIndex or error.
38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    ssize_t addTrack(const sp<AMessage> &format);
39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
41c6920dfdca378a168a2168f4a64d21af4d37d539Andreas Huber        EMIT_PAT_AND_PMT                = 1,
42c6920dfdca378a168a2168f4a64d21af4d37d539Andreas Huber        EMIT_PCR                        = 2,
43c6920dfdca378a168a2168f4a64d21af4d37d539Andreas Huber        IS_ENCRYPTED                    = 4,
44c6920dfdca378a168a2168f4a64d21af4d37d539Andreas Huber        PREPEND_SPS_PPS_TO_IDR_FRAMES   = 8,
45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t packetize(
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            size_t trackIndex, const sp<ABuffer> &accessUnit,
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            sp<ABuffer> *packets,
49b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber            uint32_t flags,
5090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber            const uint8_t *PES_private_data, size_t PES_private_data_len,
5190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber            size_t numStuffingBytes = 0);
52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
53e399acc9d9f3b7af72106c4209e4bb40de37aa6aAndreas Huber    // XXX to be removed once encoder config option takes care of this for
54e399acc9d9f3b7af72106c4209e4bb40de37aa6aAndreas Huber    // encrypted mode.
55e399acc9d9f3b7af72106c4209e4bb40de37aa6aAndreas Huber    sp<ABuffer> prependCSD(
56e399acc9d9f3b7af72106c4209e4bb40de37aa6aAndreas Huber            size_t trackIndex, const sp<ABuffer> &accessUnit) const;
57e399acc9d9f3b7af72106c4209e4bb40de37aa6aAndreas Huber
58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected:
59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual ~TSPacketizer();
60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate:
62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kPID_PMT = 0x100,
64d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kPID_PCR = 0x1000,
65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct Track;
68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    Vector<sp<Track> > mTracks;
70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    unsigned mPATContinuityCounter;
72d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    unsigned mPMTContinuityCounter;
73d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
74d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    uint32_t mCrcTable[256];
75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
76d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void initCrcTable();
77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    uint32_t crc32(const uint8_t *start, size_t size) const;
78d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
79d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(TSPacketizer);
80d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber};
81d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
82d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
83d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif  // TS_PACKETIZER_H_
85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
86