MCPcopy Create free account
hub / github.com/AOMediaCodec/libavif / avifSampleTransformOperation32bTwoOperands

Function avifSampleTransformOperation32bTwoOperands

src/sampletransform.c:226–277  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

224}
225
226static int32_t avifSampleTransformOperation32bTwoOperands(int32_t leftOperand, int32_t rightOperand, uint8_t operator)
227{
228 switch (operator) {
229 case AVIF_SAMPLE_TRANSFORM_SUM:
230 return avifSampleTransformClamp32b((int64_t)leftOperand + rightOperand);
231 case AVIF_SAMPLE_TRANSFORM_DIFFERENCE:
232 return avifSampleTransformClamp32b((int64_t)leftOperand - rightOperand);
233 case AVIF_SAMPLE_TRANSFORM_PRODUCT:
234 return avifSampleTransformClamp32b((int64_t)leftOperand * rightOperand);
235 case AVIF_SAMPLE_TRANSFORM_QUOTIENT:
236 return rightOperand == 0 ? leftOperand : avifSampleTransformClamp32b((int64_t)leftOperand / rightOperand);
237 case AVIF_SAMPLE_TRANSFORM_AND:
238 return leftOperand & rightOperand;
239 case AVIF_SAMPLE_TRANSFORM_OR:
240 return leftOperand | rightOperand;
241 case AVIF_SAMPLE_TRANSFORM_XOR:
242 return leftOperand ^ rightOperand;
243 case AVIF_SAMPLE_TRANSFORM_POW: {
244 if (leftOperand == 0 || leftOperand == 1) {
245 return leftOperand;
246 }
247 if (leftOperand == -1) {
248 return (rightOperand % 2 == 0) ? 1 : -1;
249 }
250 if (rightOperand == 0) {
251 return 1;
252 }
253 if (rightOperand == 1) {
254 return leftOperand;
255 }
256 if (rightOperand < 0) {
257 // L^R is in ]-1:1[ here, so truncating it always gives 0.
258 return 0;
259 }
260 int64_t result = leftOperand;
261 for (int32_t i = 1; i < rightOperand; ++i) {
262 result *= leftOperand;
263 if (result < INT32_MIN || result > INT32_MAX) {
264 return (leftOperand > 0 || rightOperand % 2 == 0) ? INT32_MAX : INT32_MIN;
265 }
266 }
267 return (int32_t)result;
268 }
269 case AVIF_SAMPLE_TRANSFORM_MIN:
270 return leftOperand <= rightOperand ? leftOperand : rightOperand;
271 case AVIF_SAMPLE_TRANSFORM_MAX:
272 return leftOperand <= rightOperand ? rightOperand : leftOperand;
273 default:
274 assert(AVIF_FALSE);
275 }
276 return 0;
277}
278
279//------------------------------------------------------------------------------
280// Expression

Callers 1

Calls 1

Tested by

no test coverage detected