1 /*
2 * Copyright(c) 2018 Intel Corporation
3 * SPDX - License - Identifier: BSD - 2 - Clause - Patent
4 */
5 
6 #ifndef EbEncodeContext_h
7 #define EbEncodeContext_h
8 
9 #include <stdio.h>
10 
11 #include "EbDefinitions.h"
12 #include "EbThreads.h"
13 #include "EbApi.h"
14 #include "EbPictureDecisionReorderQueue.h"
15 #include "EbPictureDecisionQueue.h"
16 #include "EbPictureManagerQueue.h"
17 #include "EbPacketizationReorderQueue.h"
18 #include "EbInitialRateControlReorderQueue.h"
19 #include "EbPictureManagerReorderQueue.h"
20 #include "EbCabacContextModel.h"
21 #include "EbMdRateEstimation.h"
22 #include "EbPredictionStructure.h"
23 #include "EbRateControlTables.h"
24 #include "EbObject.h"
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 // *Note - the queues are small for testing purposes.  They should be increased when they are done.
31 #define PRE_ASSIGNMENT_MAX_DEPTH                    128     // should be large enough to hold an entire prediction period
32 #define INPUT_QUEUE_MAX_DEPTH                       5000
33 #define REFERENCE_QUEUE_MAX_DEPTH                   5000
34 #define PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH   5000
35 
36 #define PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH            2048
37 #define INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH        2048
38 #define PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH             2048
39 #define HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH   2048
40 #define PACKETIZATION_REORDER_QUEUE_MAX_DEPTH               2048
41 
42 // RC Groups: They should be a power of 2, so we can replace % by &.
43 // Instead of using x % y, we use x && (y-1)
44 #define PARALLEL_GOP_MAX_NUMBER                         256
45 #define RC_GROUP_IN_GOP_MAX_NUMBER                      512
46 #define PICTURE_IN_RC_GROUP_MAX_NUMBER                  64
47 
48 typedef struct EncodeContext_s
49 {
50     EbDctor                              dctor;
51     // Callback Functions
52     EbCallback_t                        *appCallbackPtr;
53 
54     EB_HANDLE                            terminatingConditionsMutex;
55     EB_U64                               totalNumberOfReconFrames;
56 
57     // Output Buffer Fifos
58     EbFifo_t                            *streamOutputFifoPtr;
59     EbFifo_t                            *reconOutputFifoPtr;
60 
61     // Picture Buffer Fifos
62     EbFifo_t                            *inputPicturePoolFifoPtr;
63     EbFifo_t                            *referencePicturePoolFifoPtr;
64     EbFifo_t                            *paReferencePicturePoolFifoPtr;
65 
66     // Picture Decision Reorder Queue
67     PictureDecisionReorderEntry_t      **pictureDecisionReorderQueue;
68     EB_U32                               pictureDecisionReorderQueueHeadIndex;
69 
70 	// Picture Manager Reorder Queue
71 	PictureManagerReorderEntry_t       **pictureManagerReorderQueue;
72 	EB_U32                               pictureManagerReorderQueueHeadIndex;
73 
74     // Picture Manager Pre-Assignment Buffer
75     EB_U32                               preAssignmentBufferIntraCount;
76     EB_U32                               preAssignmentBufferIdrCount;
77     EB_U32                               preAssignmentBufferSceneChangeCount;
78     EB_U32                               preAssignmentBufferSceneChangeIndex;
79     EB_U32                               preAssignmentBufferEosFlag;
80     EB_U64                               decodeBaseNumber;
81 
82     EbObjectWrapper_t                  **preAssignmentBuffer;
83     EB_U32                               preAssignmentBufferCount;
84     EB_U32                               numberOfActivePictures;
85 
86     // Picture Decision Circular Queues
87     PaReferenceQueueEntry_t            **pictureDecisionPaReferenceQueue;
88     EB_U32                               pictureDecisionPaReferenceQueueHeadIndex;
89     EB_U32                               pictureDecisionPaReferenceQueueTailIndex;
90 
91     // Picture Manager Circular Queues
92     InputQueueEntry_t                  **inputPictureQueue;
93     EB_U32                               inputPictureQueueHeadIndex;
94     EB_U32                               inputPictureQueueTailIndex;
95 
96     ReferenceQueueEntry_t              **referencePictureQueue;
97     EB_U32                               referencePictureQueueHeadIndex;
98     EB_U32                               referencePictureQueueTailIndex;
99 
100     // Initial Rate Control Reorder Queue
101     InitialRateControlReorderEntry_t   **initialRateControlReorderQueue;
102     EB_U32                               initialRateControlReorderQueueHeadIndex;
103 
104     // High Level Rate Control Histogram Queue
105     HlRateControlHistogramEntry_t      **hlRateControlHistorgramQueue;
106     EB_U32                               hlRateControlHistorgramQueueHeadIndex;
107     EB_HANDLE                            hlRateControlHistorgramQueueMutex;
108 
109     // Packetization Reorder Queue
110     PacketizationReorderEntry_t        **packetizationReorderQueue;
111     EB_U32                               packetizationReorderQueueHeadIndex;
112 
113     // GOP Counters
114     EB_U32                               intraPeriodPosition;        // Current position in intra period
115     EB_U32                               predStructPosition;         // Current position within a prediction structure
116 
117     EB_U32                               elapsedNonIdrCount;
118     EB_U32                               elapsedNonCraCount;
119     EB_S64                               currentInputPoc;
120     EB_BOOL                              initialPicture;
121 
122     EB_U64                               lastIdrPicture; // the most recently occured IDR picture (in decode order)
123     // Sequence Termination Flags
124     EB_U64							     terminatingPictureNumber;
125 	EB_BOOL                              terminatingSequenceFlagReceived;
126 
127     // Prediction Structure
128     PredictionStructureGroup_t          *predictionStructureGroupPtr;
129 
130     // Cabac Context Model Array
131     ContextModelEncContext_t            *cabacContextModelArray;
132 
133     // MD Rate Estimation Table
134     MdRateEstimationContext_t           *mdRateEstimationArray;
135 
136     // Rate Control Bit Tables
137     RateControlTables_t                 *rateControlTablesArray;
138     EB_BOOL                              rateControlTablesArrayUpdated;
139     EB_HANDLE                            rateTableUpdateMutex;
140 
141     // Speed Control
142     EB_S64                               scBuffer;
143     EB_S64                               scFrameIn;
144     EB_S64                               scFrameOut;
145     EB_HANDLE                            scBufferMutex;
146 
147 	EB_ENC_MODE                          encMode;
148 
149     // Rate Control
150     EB_U32                               availableTargetBitRate;
151     EB_BOOL                              availableTargetBitRateChanged;
152     EB_U32                               vbvMaxrate;
153     EB_U32                               vbvBufsize;
154     EB_U64                               bufferFill;
155     EB_S64                               fillerBitError;
156     EB_HANDLE                            bufferFillMutex;
157 
158     EB_U32								 previousSelectedRefQp;
159     EB_U64								 maxCodedPoc;
160     EB_U32								 maxCodedPocSelectedRefQp;
161 
162 	// Dynamic GOP
163 	EB_U32								 previousMiniGopHierarchicalLevels;
164 
165 	EbObjectWrapper_t                   *previousPictureControlSetWrapperPtr;
166     EB_HANDLE						     sharedReferenceMutex;
167 
168 
169 } EncodeContext_t;
170 
171 typedef struct EncodeContextInitData_s {
172     int junk;
173 } EncodeContextInitData_t;
174 
175 /**************************************
176  * Extern Function Declarations
177  **************************************/
178 extern EB_ERRORTYPE EncodeContextCtor(
179     EncodeContext_t *encodeContextPtr,
180     EB_PTR objectInitDataPtr);
181 #ifdef __cplusplus
182 }
183 #endif
184 #endif // EbEncodeContext_h