Mercurial > libavcodec.hg
comparison dca.c @ 4899:e153b9ff47d3 libavcodec
Move dca parser to its own file.
| author | diego |
|---|---|
| date | Thu, 03 May 2007 23:50:24 +0000 |
| parents | bcff4564b786 |
| children | 777f250df232 |
comparison
equal
deleted
inserted
replaced
| 4898:3df69e140c33 | 4899:e153b9ff47d3 |
|---|---|
| 33 #include "avcodec.h" | 33 #include "avcodec.h" |
| 34 #include "dsputil.h" | 34 #include "dsputil.h" |
| 35 #include "bitstream.h" | 35 #include "bitstream.h" |
| 36 #include "dcadata.h" | 36 #include "dcadata.h" |
| 37 #include "dcahuff.h" | 37 #include "dcahuff.h" |
| 38 #include "parser.h" | 38 #include "dca.h" |
| 39 | |
| 40 /** DCA syncwords, also used for bitstream type detection */ | |
| 41 //@{ | |
| 42 #define DCA_MARKER_RAW_BE 0x7FFE8001 | |
| 43 #define DCA_MARKER_RAW_LE 0xFE7F0180 | |
| 44 #define DCA_MARKER_14B_BE 0x1FFFE800 | |
| 45 #define DCA_MARKER_14B_LE 0xFF1F00E8 | |
| 46 //@} | |
| 47 | 39 |
| 48 //#define TRACE | 40 //#define TRACE |
| 49 | 41 |
| 50 #define DCA_PRIM_CHANNELS_MAX (5) | 42 #define DCA_PRIM_CHANNELS_MAX (5) |
| 51 #define DCA_SUBBANDS (32) | 43 #define DCA_SUBBANDS (32) |
| 1253 .id = CODEC_ID_DTS, | 1245 .id = CODEC_ID_DTS, |
| 1254 .priv_data_size = sizeof(DCAContext), | 1246 .priv_data_size = sizeof(DCAContext), |
| 1255 .init = dca_decode_init, | 1247 .init = dca_decode_init, |
| 1256 .decode = dca_decode_frame, | 1248 .decode = dca_decode_frame, |
| 1257 }; | 1249 }; |
| 1258 | |
| 1259 #ifdef CONFIG_DCA_PARSER | |
| 1260 | |
| 1261 typedef struct DCAParseContext { | |
| 1262 ParseContext pc; | |
| 1263 uint32_t lastmarker; | |
| 1264 } DCAParseContext; | |
| 1265 | |
| 1266 #define IS_MARKER(state, i, buf, buf_size) \ | |
| 1267 ((state == DCA_MARKER_14B_LE && (i < buf_size-2) && (buf[i+1] & 0xF0) == 0xF0 && buf[i+2] == 0x07) \ | |
| 1268 || (state == DCA_MARKER_14B_BE && (i < buf_size-2) && buf[i+1] == 0x07 && (buf[i+2] & 0xF0) == 0xF0) \ | |
| 1269 || state == DCA_MARKER_RAW_LE || state == DCA_MARKER_RAW_BE) | |
| 1270 | |
| 1271 /** | |
| 1272 * finds the end of the current frame in the bitstream. | |
| 1273 * @return the position of the first byte of the next frame, or -1 | |
| 1274 */ | |
| 1275 static int dca_find_frame_end(DCAParseContext * pc1, const uint8_t * buf, | |
| 1276 int buf_size) | |
| 1277 { | |
| 1278 int start_found, i; | |
| 1279 uint32_t state; | |
| 1280 ParseContext *pc = &pc1->pc; | |
| 1281 | |
| 1282 start_found = pc->frame_start_found; | |
| 1283 state = pc->state; | |
| 1284 | |
| 1285 i = 0; | |
| 1286 if (!start_found) { | |
| 1287 for (i = 0; i < buf_size; i++) { | |
| 1288 state = (state << 8) | buf[i]; | |
| 1289 if (IS_MARKER(state, i, buf, buf_size)) { | |
| 1290 if (pc1->lastmarker && state == pc1->lastmarker) { | |
| 1291 start_found = 1; | |
| 1292 break; | |
| 1293 } else if (!pc1->lastmarker) { | |
| 1294 start_found = 1; | |
| 1295 pc1->lastmarker = state; | |
| 1296 break; | |
| 1297 } | |
| 1298 } | |
| 1299 } | |
| 1300 } | |
| 1301 if (start_found) { | |
| 1302 for (; i < buf_size; i++) { | |
| 1303 state = (state << 8) | buf[i]; | |
| 1304 if (state == pc1->lastmarker && IS_MARKER(state, i, buf, buf_size)) { | |
| 1305 pc->frame_start_found = 0; | |
| 1306 pc->state = -1; | |
| 1307 return i - 3; | |
| 1308 } | |
| 1309 } | |
| 1310 } | |
| 1311 pc->frame_start_found = start_found; | |
| 1312 pc->state = state; | |
| 1313 return END_NOT_FOUND; | |
| 1314 } | |
| 1315 | |
| 1316 static int dca_parse_init(AVCodecParserContext * s) | |
| 1317 { | |
| 1318 DCAParseContext *pc1 = s->priv_data; | |
| 1319 | |
| 1320 pc1->lastmarker = 0; | |
| 1321 return 0; | |
| 1322 } | |
| 1323 | |
| 1324 static int dca_parse(AVCodecParserContext * s, | |
| 1325 AVCodecContext * avctx, | |
| 1326 uint8_t ** poutbuf, int *poutbuf_size, | |
| 1327 const uint8_t * buf, int buf_size) | |
| 1328 { | |
| 1329 DCAParseContext *pc1 = s->priv_data; | |
| 1330 ParseContext *pc = &pc1->pc; | |
| 1331 int next; | |
| 1332 | |
| 1333 if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { | |
| 1334 next = buf_size; | |
| 1335 } else { | |
| 1336 next = dca_find_frame_end(pc1, buf, buf_size); | |
| 1337 | |
| 1338 if (ff_combine_frame(pc, next, (uint8_t **) & buf, &buf_size) < 0) { | |
| 1339 *poutbuf = NULL; | |
| 1340 *poutbuf_size = 0; | |
| 1341 return buf_size; | |
| 1342 } | |
| 1343 } | |
| 1344 *poutbuf = (uint8_t *) buf; | |
| 1345 *poutbuf_size = buf_size; | |
| 1346 return next; | |
| 1347 } | |
| 1348 | |
| 1349 AVCodecParser dca_parser = { | |
| 1350 {CODEC_ID_DTS}, | |
| 1351 sizeof(DCAParseContext), | |
| 1352 dca_parse_init, | |
| 1353 dca_parse, | |
| 1354 ff_parse_close, | |
| 1355 }; | |
| 1356 #endif /* CONFIG_DCA_PARSER */ |
