google / ExoPlayer

This project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media
https://developer.android.com/media/media3/exoplayer
Apache License 2.0
21.74k stars 6.03k forks source link

Some problems about playing H264 (Annex-B) byte [] data #10722

Open nozuonodienobb opened 2 years ago

nozuonodienobb commented 2 years ago

iDear developer, I want to use Exoplayer to play real-time video blocks received in the form of byte arrays. The format is described in the title. What should I do?

rohitjoins commented 2 years ago

Please provide complete information as requested in the question template. The template can be found here.

Unfortunately we can't answer unclear questions or those with insufficient information. In particular, it would be useful to know what the error is, whether the stream plays in the ExoPlayer demo app and (if not) what logging output you get when trying to play the stream in the demo app.

nozuonodienobb commented 2 years ago

Thank you for your quick reply,First, let me describe my problem。Our app project is to implement the receiver of AirPlay2 protocol, The image data we get is H264 (Annex-B) byte [] data section by section. I looked up the Issue of Exo and copied # 8051 to rewrite the dataSource and Extractor. But it doesn't work properly

nozuonodienobb commented 2 years ago

Thank you for your quick reply,First, let me describe my problem。Our app project is to implement the receiver of AirPlay2 protocol, The image data we get is H264 (Annex-B) byte [] data section by section. I looked up the Issue of Exo and copied # 8051 to rewrite the dataSource and Extractor. But it doesn't work properly

nozuonodienobb commented 2 years ago

Please provide complete information as requested in the question template. The template can be found here.

That's what I did

1 this is my mirrorDatas `000000012764002ad41314503403f9c26e020202040000000128923cd0

0000000125c800400081a2089dba81fa7cc73a3ce015637f8fedf4fe4004c193e1774e67b0f8094d5fcbf3802d9d9eafd2819c667944738e1f1ca9834e3dedf1d41a76997484acaba8e5690c50a9e5085039d3a08ec2fd87d3499fd78d84aed5a2470f4c5f35ba802d2178466c55c0d45b6c1121a404d7467cca70081458b50a6a7e3392f8a84f48b7796ff171202b66d1dd0786facf65582c42baa7d13f6fd6ffd74ddb4e51a90f723bb8ab032a784ab12f585c295076cd2c96dc3618bbee34f2b0b1494dd51e23fd7adea03e19739b311cbf0e359f40d03b0d0c3712c98a42d83b1272cfd2b29836b00e4819df6dcf49fc8653a33af5ae7a503ad7e6ea79fae3f13966fef28b7ea4d2a7bade518d1a03b49257dabc0830c99c7761869383d9f91609298da0cdf82dd499a80123959950ca24ab108931ccc1929d42a2ae0ce92156273972cf80a0d933d4a91c6f109bd39dd108364b37f6f4b565315c9bdbd4989d34d82dc648a84846a514e624dce0adc27474427305d845f4984afedb38de16467ab82ea3075639ca77aadb0816bfcdc3a11cfc3c5525649fe3e4fcc371cc9f6988f3980b2eb86369d203e7c3298f3707f9661e3b5d01ed786a896b53946b501175e970a63347ab2ad01fa1e85f997c1c0f86fea169a55fe9a99a38896abe00b63ffd80cc3c49d074a269462d947d1853f10d989239b74c4ceaa8dab96231db8a369e7d99bf2c47b14a39e49db94165d8de1f79634b37f8be8266759e171a7644d0d3f7f9771b542429f5c31beb261155c7ff7da57387236168afcbb429afec553fef5ac4bd88f15559e02f662b7bc48d891e8839ea0991af774cc1cc1c25a0f89e977264f7e96db90175be2a7c41779141af614cd337e45403c6cb8947229b2afdca63cf27585b00f22aa1fe80a6ff885c217ab20ace3b0005b9d4fd9aea0e5e84ba03dc750ad85706944a03e90b7ea900192c9090b8451bcca37f36f59caabfa01dd1cdd766f0d2b919982785f6cc78a9436f589b7baaa5b64c5741925be5e137276022a03b6770836bb38934f4c62fd5f06bac60b57cb8b642a42ddd451353a909473df35843ebb6704bee7ecfd106ef9f00d64374a42cbce37af5adfe16df5c02603655efab00e5edd47d64bd7b3662953b88e929a42ff07eb00625e9b1901f4c3b354cb09ce8b9bb15ee6596c3b798520b5d4d912e2e31ae61ad288fd4033431fdefe5bd0fd67c286a0d0a3d8961ba49108706e4d3794e42d95cfb214ede2742da6b0d47ebf1d84ecf29e5489f176040ff99fe7e7a9957247b17f7ead044d370ab06cdca441793a08f31aa7451782383aeb0d4629cc5936a6ea1d9189f5c5022d028e5016f1b06c75580f142f10fcada11ba8ce0a8b39353ecb423a1ad51ef4f25a24bdacce8de5e4723853862c6852f8fad39eef11592d1a8800f010f34773fe98e82601455908a7062309a66e1dcc2f0ff8f025d1b6f667f4501fee8475e8a6cc46d055fe86ffadc2005805c4ce40a6fb57ee61dd6689cadf1c1ddac516224f116f5c5b7224232f3d9867c60ee9eba0684e9030f2977971338a2e37c067b27118170d5a8d42f316394c261ccda4b6bb2de5275f22c246ec7b4115d5adf0ba07e34ffecac235ef581f735640d976bacd34795f9f8bdb96b471d16f9963d1dbf364d0ac7d84dc5acc48444c44003db5b3b436a6f37b15a37e3998a7b36dbbd56aa2d2eb21f52f1b642ad957ad41cca4705b88bbb6def37ccd1d499aef727265e034c5751df2bfac11997e7f5d82656c903e67288887d3d2b98308e83b6b240f86f0e844fdcd30f77dd59c181a7e05d2b847bff2203de8c6f6c4f74441ff72ad4db2b7ade8081f10711b33a680e7336c87fa974e5f4e04205e4f52cf8da7909ef3100180faaf10b8cd5b49212beabf96e292a9774b92a2c3a5ad62029c74cfb46658e1f1dc69e78cad9da0eb34d002cc8d74f2b9e4b8a600ae16cf3d52060ff279015abef49a2118cd2fdf3c7889d27692561e4a31defc50d7852b883bac97db7c0de6379a0ceae9bb25aaaebaf3e0823755cc569331e087562f1b691878e252ed4439edce5484d2bd2398f6b65827692e3792deb018d34f874fc9f5d52ebcf83874bf4e46285f8ed5a19eb8614c372b7e8ff81732a36afbe0bfd70155b667ec298f5711e8a9bb57027ad6ea2ec7f8561b2e5714c598d224fda0838b8ee2fbe086de0a0a5bfe4fea48257acd69a8b003981a7202b870912cf7718e40af37908e3869a29c68dfc9ca5cbd24c8494fb1a871ea1d3c859b974ede22fdccacc035885ab016d37240e7ce85e4510242d2f54bb3f9c38c4b53dbcd81abdf85fa16b0b1b356fd4ccd5db17547bd939d3ca63283067e6fe38a1d2a18883e3ad9b5765c3b54cef9ac52abc0575394a4b61134febb1750ce9573c7cf1634c184f53690921529c971285ba30af694d96c7e2b6349b324681b3bce7f49eecfce7f2edcc173459f23e2550711d5080300c6dbbdeca7e77698e8daf7ff25b73c61e464706529807b52f6fab38f92265e247a68b7aa1cf85bad45f46ca8fd33048f309b3d806a81e31ed5b64bdb598ce388dcbae04f580c92b68621b21140ec1e469ec9401c48a4229075823ab29317d77894279f6157eac08548243208607e67472c08648f5635c5add19bc0370fc27a88290b25156b84ae7dccfc341ff4a312d68cec92f87f3d3f760774d437a28732767305e402af05e2ca65610fa7bb838a9a7f7bf9d0dccfb029e3fc40634d6bce1e2c272a10604b42adb2d5c1a1b93a633ef0b9b3ba14328e860a5ae3b47f4ffe8c6ceac5f6d6fa27c46ee169c4a30784f2714342b4f3052fae81ab04766452da3

0000000121a00200125675c1e0197a4801bd107f2529fff763fa759c73fe83d026f8313f4d0ab55fc9fb849b4ecc2271c5f96fdbc73019c72939bfa0162d36dc022339a05b1ff50fb6901178fcc4010810b0b87f73a57c52b323f23ee2fcaac227b9be168c0d054342a44a52ed7eff7d81223cd84a47bbf387bee43d1d32f7ca3cf70bfae7ec22d0f1b39b7d81a7801f4183aabcccbdc9fb7c4871346ab4c05d25784d2cd2222ef06f2e2dd2aeb5b7d07ec52eb2dbb6a91d6620e8421275249df78f80d582a838d3e07ec20f3a96fc4113a3703fd638e10cf1e5a3275a24da9c5f5da6f0979ca58e36f9cc46b78aab84a53641c31752a0f217ac157999cc234484fcf7da6a6d61eb9792828297c00ae09167f55948402641812a12ff454774d26604fb2c5cdea9c2e79e5e52a1ceb49d47d5f9df6a4773f93900e94741d7db237d6d30ef576cfbcbaa65913c228b841ebc5ba1fce4cfa2b37008905d5eed5224b212172aa6401136d69e274a717f67cd7dd14876c4ac825a27001430679d38e779f471a679b7e25a74d6d84258a54f4f0be7fad599d5b519dc1502f56d1a71c091abe473949ea3bd45ee90447168e635bc3401a50fe8091fb1b82d15ea110733aaec2719d803bd98dfa5f148ab36b32d0b59125e6ab43989050ef2175f0603427b327f00a758c31148c69051d57cf68c32977fb0fc074d7f80bb52ac3c9f2904b260a8e8a74887d4da100bea79773e8471b3a929cbcb62da79cbafa12685805bccd85386a252d1b24c44b91a2f72c38d16f599755138a9cedfe4192c0f095decc96a39a7e35ffcfb778ec016202ec20c28f34bcde8cf256494622e940c28224a8084d7fa38aafb6ab32111c02c51dde76592c34f2ae4b3a98b0a4de271a80a14f4a5c48b20ad32b9296475655284c7b96f7235a2d8e181dc015a9f98567f4a5781b8f4b9eaf7ef56aa0a4858cfd33f9e22f7c3b3a657fb21907b6a928e3c038446f5e0f23f46334dd8891216b7617daa2bbd5ba12d9c30a03f4840be35a60a63b7c15610d467fcf186c084a1946fd573898db5679ab23587ef39ccdf2a3338e2577618341501a017a096c23157501fd582b274b4767998e715abd60f29f2ecf2c3f839334f026b256a7b718480745479526ac94aa25273134314b67704894015d69076e4175dcd43327bfe9303b2044fdabd8936dc0f88933d48a8d0ed33980dfbf3cd78492d526778aade1d48500876563d86959dfc7714adda66bd3801e27d5bc867b3c681343360990484ab246ed1891db678ddb6701a857660f235b90150880ca4c9191db8f01804741f04bee3cebcfcfb8f7a91d22093534916db80e89ffaffa7aef277dc8a73e6d04ebe137cbd9fd51fd735288d4d2244a76d54f3a28a78254e6910b413c4f1b8a3b9637fe36e2a41623766d13d8d6f6315c918b7fbd001b9858955db8e81acb6d89c835002b0fe7c99779bd8d28498d5dc951a3412d6a0bf5fb78fe0c3d2a3ffbfd0b4698703d796202a17cf8cd050019aadd041d2a8e776237bf3a7cd1796af1d1dd5578d3be424ebde6bd7936ff8a9344c3413d97f25d53d0bd6d6f8025756be9ab3694783a2bcab0eca1cd794f8fa99034ae378c3e9631a91de86970b0c189f8decb81a02e8dd3e88fbda9704a560727fd91426665cc0a508a0bf4985851a3dc06348c97931c5068bffe6bd271989cb779e64c9a17c1c491c0cf0f4788190d59d0ada774a7e61c53ba96d166a3f4d7ed2890e21f411df00768e448f9594e880deabf8fbc116c2501fbc929682fd92169460c49722931b43667e00c2810f8d75acc36c48a031b1f30e8848

0000000121a0040025de4a43c4c1c8c978230d540016986a67e5a99097f7475686ee6bc3e23618522f038eb3d8bfbe921088b2629e2d69d1cb93a9fcf6ba690e2f6bf2b169eaac89cfb4ba04a12c95e5b6db2cfb81e800bc1989f764dcff74111c635c637b4e85db6e0cbda05f1d42bdedcf1e57dd6b6e1c1b879c1612d6a1fecfce04fa4fbb942d4d7ba7cd9babbce8fb1c96574b129026ec8ddec29844aa9dff0827c030375f9457fdab9def7a1f2edb7eaea44521b547436d6775cc89631da2ed76fad72c96c98e3d516d8434e4dbc8dd6edf0e4080cd82107384c3ee2d783f654051c53f28c7640d68ff65a539e9a1aeee212f096c253cf2ad8f712b39b001390855d8f9e5ad69c66ace408139ff7c1b48b48bd6b18024da4f5fbe480582d6463e459e35c5cf7b13a02f579d1108e863202e1a56e362f40902b517e551899c0c107f44bf194cb84bd69e51b1b257463ee6d9887356dc4e38a7225780524d10b78b14e4c5f68951cb1e477034a58974c5c9458a9a12e4fdab0986d07d9bad646d5646f217faf5f63621c389e5d88b05aefcbb28de93aa8a3ebc60298a7aad2b71647e122ecf8339b25392bec8d179268c5bf671f24471ba6b851a323c45c1d13b98e076e972da099d2bd93708e72e7c586f8d8075c05c94b7ca9082774d3ebea8cfe881a6f4740fd3ae421b8494d2d38e6d254de82cbb184ec282547a20c64291d2167192dac2f2864f08dc0870b6cf116fa12d04b5b3ffcd137640b35fbdc22698142f9d42074663cbf3ae97c308b6ebca3ca71c310a75620287d4ce07bdcdf7946c94ad08435c48dfc3f8ba1a4c9dcf83433cb9af4a57e8ba2af715d6f46fc987b00f60500ea7b9750ba09178ed524afd6cf9cd4fe9d86c178d810aed1805d913e792fc8d97690c22fc3302fd824b7532c90f496b4e7e2437060e43eab3d1f5f79bf73d7c31f866c7322d87efcdb57a73146ed6a1be0f85698e0d87fc1d08411fda003bedbbb58b91426c405ac2b40b55770a70681de35394c2ed460d7b0562ad25dcfa5b745435c2984106ec1279ddc76d0dc9a42953e74398bffd232586c7a715f900fb3149657e055f7d95f9b8e9222aee0ad723111d4508cde9925712b55081cc9cbfd56473dcb9cf552a80462f6ff1088f4fd07ee05c3ec2b71696b72b5f874e1065a97835f0dd107e5ba2c00aae071861060109550bf12d292f543bcfe09c5b4b3deb1c5f68050ca9142c196f90f7acfc373d22040a6c2e6045a9a7491477374caed6fdb0bd24f6d1514d8f0660de86d84089379306bf11c6d90aed881ad9a2296fb27f470f262adddf1151bd18d4008f30354bbd1f8659084090125d138d5f821025612209229975d7042d76ba94c8eeddf9559cc98febe093068b7055eb727e442d6e025ca92f5e630541846113ecc43284183122ea280a02d3ce947d6e2c790a794649cd1c8dcf69571c43a0a5b43b7a9a4cb8b55f7ac2cce52e2375fa680e4e9ea17ed2425446f8b5ff44d955d5e83b07954dddd66116e68a3280aa56553748c7456dc72e7d5ddc67071da038e14f42b6dcc1cde58d7186b2231d123f74fcb4e5ea4376b4d41755dfbe8a903b604b8972379f2b10320d75c7de35752169b5b50aaf72971e517a8e0b519cd09aaac58b5d60a279fb1f7a491fa3363c5bdb65ec5a969ef88f2d76ad518399a0c7ed80f7b4e6611900ddff96af7ab96e72b2999882521c3867ec3df5fd358c01ee0e929f32b05201f5660ad59120bdb9a34f38e112d80014a96de3303b7deaaba50f868e302d92bf32d6ec036bd6b96cf5ff52dc6d567062a6184f3a0dd0be89cd4df6ff3e74119f548187d608601b822aed0d925cb95d4ffdef43ac90a955257c62552ec9d13449332ced90167f7963ce983ef8c5f98bb2d26f2474974ffa78fd7db6b893da25c3feeb7c9fbc1d478357dfd1975104188253da3f33aa28075bbe28f328c9abee484e3eaea6d66eea139d3a3eb0869b4336c0ed6e5866c558b7ba244f33971aa86caff4ade675e7129061be41983a10b89807f0f8a0970a6ea1ea407aa68c420ae17843e0570e57c5eade9ec15e9c9243d8a1ddf7619e0b5276a04c40d5621723f3663009413c7c71e42d543652702991844537ecef6a16916666dc286483f14cd9a81b919acc01c7cca6fd9bb1c85040f5ae23a5577046b8fd39dbf6573850b580f449d3a2aab53a1fed8b9df47a496b84e54bae6f60eea41a04dc37a5278323d5a1549a381644c3b60ac23290b81031137d1e34617ccd7b3967d23a47b382791c8f7b9ebe23fadd1e9afc4472635385565b460da973b04dd75ac55e644b29045e1513db4f5c5c1c2c6cc11b169b6d51af3bcacb4224164a471d8ea356db611bb24e3976c3b5677f1dd374f555f9d7acfa8553e981a2346dc0a8f3daa7898b2093b11dcc5a4b5ca96486fc9d42a893660a4cb04ea69b1eee005cecd00cd59f7596bdbe9edb0f5f8f18f02a289c29cc0791d84f0a184217d6c5c6ef14c7673f82fd634d9b7f34b36e0c1a1a20397ab83d21b7651b3dcbd9404000006f82b3d4e4472f2da670eb990983498fbc9adb5a814f90c1a3451ef51c755b9fb9131d88d542691a6a6bab525f1bd08c36da074396de41c3aa0e61fe42cc1956dfc49bd3e502e8808716ca3fab1c6953d4c248840404224f18745c8c0d631e2a1df89fe636511ce1616d5b784245ce960b7215c14f314873b9c9b62c79e8d83d5622199d65a152c86a7ae0c9f264cde7158f6dc0ce91c465a288de945b8c645b24f1329a3618dafad762bb89fc8efd1e1715b5d1139148b663b2cf7870474b9beebc91641721c9489128714dba7227e966cf53c9862cac44

0000000121a0060035ce4a53c46f88700a31b3d3abaea662fc806baa8000092100000300000b984091592247aa79fc224fe8d8bf0830f4eb92003b418bf33927b903dddce41825503211c0b157b7f000955722ea2dcb580dfc29d660200715bed08fca9cb738a48826bab1ed5012f0f695c1cda26705d210435dad085749eb5f80d6af3b49097a5728eb88650a50f8f6a155fccb75e4bcfe419f221c6b857120dafa5f7712db51e67fed93b7a4fb8a09aa65365c7634dd3862ab25c71d0fca65db68badb09404ec7e70fd1d45b6433691e4b14e77230c851dae5223fedaa51e8fe3fe64050c0969b5cc53bde3b0f27cf56a44210f10ae05fc8e6fc8c815e19b90f39cd9164578d9185c115629d095ffd66ee0bcdd634cf0bfd8fe573650680547754d584aa52c78bb0dee0a5df83829bca4ba7b7a0200241324e2a8a52cf46cf146fffa37b230e1530081ad18f4dc5d1037785c77a7826fb5e7c095215a28681768226f6ce20393d35af0a5bf0002d3710cba154031589b811e97cd83a73652d7bbe4890d7da4d013c2c289acc32e8be9404c76f5b2d173859ded4a4c5d4707dd55ce1d7de3c4a48455e14fd7448f85ae3a2d34e90d4af92d7cbe9e8a40ebdd0455246a6c99cd8033dafd12d6e6445ab672d31c381eb76e331dcd7f010d9d092153d735610b470cba500189e6b177cf071a8f28ed9447eeb64b9b860d76b1eb9e4380bb49c1ca572afdd7c11d4f30f74afaab85582501da7f7fa636e39d7ea7313580819ed059a1d62f8173c435ed1347f51676fc64530bf3eec7e6de97b8b4542878881fbf3953b9634e9283ac57252b2230a904f97a02dd054f9085bad830d3c8970a4a87f741e0a3420045c521a629c9cfccdeb319f4c01703ce203481e911c3372fb3c528353cb7b966b9796e8888a97f682120d1e7b6d69029b1b6afe02a833e1701106e4b442aafe5f49c4d298e65468a569c1fa88fb5ae369270fd38f75502f976205a8bd5cae527256541a46724b42c6aa5d0c36c71c7b590ac46081032946c32777f959fdc0bd331c6834f49867efd01735c37d5e4a4c48f717e921c22e0ae92028e8a4ace35eee3d486a8cb8e84e93eb66dad67cbae80fbd62dfe9b761a2b827b2c55fd2ef1dce1ab2b3ae4c926f430e6192377bee877ad8ba72729020fbdf27939819a801e0aafbfa0cab52bbdfe98d95f5e10db9442d2faaa14fd9bf8194454fad667a592f932b8577014becfba821c626a7b175ef7917c320c4e1a7d34a103c84bcba9ba16160ecb8c4aae48f554a37fa882884e2b8ad09283826f7ee23ae2422e224286e33e8c83c0905e99940a47b2f666615241579fe5f7d341c6729d34455b1356c106492bca54b467e11b7d3ff7fcc421700c2adb65c6406918990ce17d759b5fc63f2500d2943bb19c30c9b220c1ba0818d4e9268791885e945cf43f230166e4d35635e1cc7856bb24446976f209a5f236ea55f498cce5013816814660eb6ff4bfdef24f565d793022eac7d678d8ad04ec93b25ffc3f296d32007a52ef92ffa390b126c1a69ae8581640f9751efe3a63438848a646f1afc7d4d14494d33dd2981332e40374d6d019dbfbd33715272010e2bbc1e7133234c532a802d3822303914ba3642579898d882914b98f6b48d73b0b09ac694ee2d03b9f983fe2dca043b9b249479e96feb5ec2c22e7614f36eacc0ecd1f8dba02dab860aff8ca450c8f8fc9b604d8b395202ac0cef51b2549dcf4d37d455f1693a5003cfa9258cc31f9e989c757659dc3ff6b591c5bf37e641a071a9b6e76ec3d2b8b11241dab44c120e97df90109fb45ebecbf10e5336f5a4685c960cacad8984a80b29fabf42b28b6a598ef05958e07c55258f476eb659f5359da97e6aa85a01c3fb53190aebc9750004c7137d600dc00a2e015d8869870bbb727adbd892679171f4ef4dd33a7db27014700a6c227aace0a27b1dcae0ecde22fe2ecd36a5238917529e77e1cf0fed89558a5f296d85a02f588c6a726df3e25a43633cdcb4c930bded5f8e5c30eb7a4ec5cdd07748b605c92748f93d87bc3ee3ae83395f179fdf0022113e45086f2b628ab1600ecdb787e9880d1b5bfce09d66159bb0613a29431411735fb43c33d025ad379a4eed396b0d464cc2903db6ab9b9a0464ec62b8c48208f1a68b61192eee4f84e2ffb62fc863d167636ece54ad0c31b2a3e98a3bd30c7f2f757d7d85a059e875b3c466a2332282ad42391c35d66ab08348025b298d4db50cd7ac05183d70593cb10258431f208cbc5109a92fd3ee9c8de50e080c56805463ce8ec00c312f91dfb3db2d6b7c22f0cbc040344677b5c3ba721c9bd8eea245e7b00dd6a166d537c811c7c7c307229807dadcbe2c6c1b9f75d09ca3168214aa7204c327102da0017ce44f22c2945cb06081c6789c91f39f95d428aebdc418f76ac4d7d084b47d512ec63af42dee1e5def49b5507541f3294213793e946bc08283a03961568f53c70c6069481507e934556a99c74767ff3ca47ab32d112d37271a27a72e43429d0fabab11aa6e364477000adfe0f489016ac840e5e0a8d91463dbd3ad35cd4a84965c7018d86de498f52a7030deda7ed59fa1c77a72629357a9cf5dabb3cc12d11130cf363ab6bbd5b03292c8b238285b5fa873d1e3ebf9c1a227b1e43f93e9cf24cd9df7dff016a834874f9d0067cb4647be1cac316f174c3314f54ddb6957bf9067c7af2416a0bb54a8dc35914aa0c645a9ce60784618b850accdc2ec6684123e42f2fb1a911e24a47ddbda57af9102a13aca0ee75c44f616612bb302c35612c56b2d2e62b20e82fe3d51fbc7e8c3f5651bc6228c22fcde9ad4bafa60d2828d2386f687

0000000121a0080045ce237f9c4034bbe80c4941f6c98af72414c728d558618c3b07cc246dd0fd47882fd37da25eb5f9752c692ce4ee3e543fe8dea3edfdbc84a66924001233bffbb65802d094e80d7be061d869b28ed206b781b17d88dd8c0d874cc5b9263dcc1cd39c103aaa12ca72ee8a04f8a70f756e058a51a732074efda6540d62848a1b12b5f99610285a74451d9db7bf21b4ed52f9e74636bb4318ed94066ef026146cfbeffc0cf432061af056631963a3f6065ab5527cef241d93c60d78f096b53e459a0ef48032839bcefdc0b373dce25c12318f6483e833a8ce83884df1d6e2bf87a0b5c045f444622a22849a98480a5b8994a9fdc83187cb75b6fce440329bbb1464049524de3580182aa12efbea8cd715ea12086f7fdb1c80156e113090bed9d17afe01338505c529fb5baf2bf77f34c92239c4116419af49a7bf428dd1700f49f5b34e4b82b2d58df3b6bc297a2f9deacbd7d132db0b1f039a2a11a856fe136c8a01ad64ae28bb2318491968b493e2b39642ee19b4eb7a92c63145f100aaf4793b1033097bf0081bfcab0de6005ee37213a4da9d8b13cb303f5648a03980ee89a6ecb33fc1631bd593d4e3112a79aaa21fbb4b0bc1b6853ecbc075ad3793d52fe2294ed1755e18bdfd4d35d470d032e22fc852757069c5788f3449a475a39eded6e08f4476976e530374685d19671940e766f8a94bdc3acb8fbff24b75821307f06f5214861e77736d10e69a5b2b3227901b85e6462f8d65b6059796bdd71377f59f02a5901882f1fa2fa83888cc943825f0a829ce714f7b0e3be7a4c93890e1e72a2be15ae0af0803ce7da9bea858724c7e1d2b02f5d5224c052e5eda9316f68cf33944fe4e7a0033b4d28ac4f19529e248db17b58eb498d2802f63f416c952ba9219a2b6609edfd0e3732ae3528d87d18765c18f13572e02194b8ca9f0272620de5a3ee797f011cf95deba28d2156e221a9c4c9b54dd00e559d0b6833fdc3fe0353b2c76b306f0d6a58543dc36ee42deb9259350fdcc7e90b9b4a9ade79bc64c09749ec7234564715c458061b9cece97417e4d42dcbcbfd6dd3e672abd128021db8b895a136f9d7c3629c97fad86e2b6d447793513bf649b9f87906ba3853dfe399b676474004a0e52e8898dcbec8533925dbaeaed93f552c811525a9c26792cdb4d2302d444a6ff03fd50e3cd0db92e0f2693a179f37082227d3077feb9c8acedcc625424a6117589429f13cab1143b200baea7dcb4edff35613625767e5897de73ca8e3713dca8099ad7a60ef0fc4e94d7dee52269bfd13ec5abf99fdd4bc4087e248f80a00107b724644fc5dd1401bf77a1b2a37c481e8bc2c09f8f1a8271e0f4af36551f9bb8f762e0cab73d4ed836fd9715e6082a49c1311874e75d263b652e20ef182d99e7f6c786a2f36ab957654fdb5af2ee634756a8508dbbf09a920793ffa4f7b67f838fc5823f9ca6977f307909e0ab75d0649787b3cc7238a0fb37e6139add93951abf659519d743a3f30e197fe7ff78a93a9a7fd1e652db30481a8579ea73ffe035bc0eec9c27740fa45cc0fe641de3f744c7a3d964ac7879e60a86c17121cdea66ff6432b6a73fb803c05109b7657c87dce6f6d06117edc746878e0a656060606cb3dae3518c38e5cd4ef31fbd39365fdfab2bd99892570fb679b8c6a332c3d89c641dc9f7e61eb593eadad0fb608b115c34f9f4294fa88eb883ff8969a2cc6fcf04dde3b89e9e1b67103775e2affe249816a89abe78cc7b7c75ae6c9e81423ac4be6e399f646e9dc6e0ede69261241170b00535f91fe6fd2d6d172b788cbc7dfcfbbd1af083d0be358eaaecc8df1d4844813979324ea63c32ea29bda925e3f969ef6688178d851c45b73aff66e120503da61c02cd7ec502750be348e1085aaa7565d27da54eb1f3a73a2359aeda9be4ac11ff2169693929b9a9cf6b4b935f0db738bf7183bf0328cc621ec30dfc6885ed4cf0bc2ab484a4de5957e12bfdb7d52fe21d9f73b405ff3e9ac33d606363f84dec41b76dd61ce0ec41bdf19a2f58459a6f7c6f5a0b93e9181f302f44de05d7b9e222465d0934dbab22f84ddbfbdeb4d3fd0dcb4997f06f72a64ccee7d53cf281d9d9d78fd8a00bb3df2147920706bc37164265875946e264acc455c82d16912f04c1c46184c91dd91e545bd93aad50b3c7b5d83a1d837847dbf96957133d6b786e8967a48ee469002bda1e685b503aabe5e0226ec619013e1c026ae83ef65b7cbd631206e1c7de598eff9acebadaf30e03229d1025330194be8472460ad7b58293ca36ae684eca85abf089f96598de7971f98f247db88f23e6fe287bc9fe331f3790e07bd38366874f62236244db55f12742736b720a9dfd91fdc8731ebf0bc67c30be96c997b0ab6f1ef49d966060123f1c9faea1ce6089cf6152001a2285a38fb08cd0aafddeb78f9c39204b7beaad744527beda2ec83be5178b26379b64c6dc77cbf9f25bc4b2d9ca7e8909639a15b1a1a1df4447a3646ba917ef89232bbc4f3ebdbdff39a9b72ebf0936fff38031ec1de7571e27bc4571d5783be1f0992dc9c047270022adb9df224afa80cc1a484dbf3e244768c842bbe9384ba43341ff5dc4f7ed4cb56fc2d12b28ed819bf0c17f50eff18b58fbfde1c17ba91517c51d758391ac768744f49cd595cbc2b8be1e8866b20958bbc79a9fa66c709ed00c412dfd36f2644dfaf5fe6c893ccd89afce6c9771eba8569fb0bcb66f36a90999dbe9d1bd1e6e833f2554127d8d73802bd95c8c87995b17085241ae7e319fa7b21ec87c000240d767082c02e426a7d9d3d346e287e3ec73e68b18dd3d4d43da003f17d79962528c382f26aa52b7b2

0000000121a00a00511b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878242670f6c80a09c46249d83cef33c55a2c85f1dbef483d57aa576e82c8fa81946bbe75f6039220c778b894038953dc05ef2c904adcc34ead1d43f72963e6c489876c92b8f3f87ee51e1d262470430a10f0f210196d8bc33a162c792b90d7ede380000c1b731ab00118300aaecb65b2c2d96a0af212ccfffb6bee041d055e1c0bbb1061e218fcb11bae608b76c4daa40425c3a87e55648a228ff71c002c1090151f249d4ab70c95e350f2b49354d65a25a51a18d06267a6e45b54911413e9cddc28f1984d96e22906ae55236769d527f82ce0a107a87bf3e43403cd4c9c56fbdae07d306547d8a8bc8f21f089d5c3914c16f99cd40d050eb7ac977214ef60d3d8f65bd5ae89123f0f7c62ee08d71705a13b8efe5f16ace2c1dd469b89418ba15c6e80def1d9c4ebe5b2a3d53208948fbdc40aa9e22f279032d5c0cdb08f78ca9436cd7888089ea6f4d6330385c994a84f5d10bfbc6d24fd961a9d166ba685a9e49fdc2f8bc4c92c412bd86dc1d5fdfcf2559f65a4a8f4305280c5453463723c4904b5302d06dd5b66f24382f1e71ff30463bf18f383d2db7f0ebac6d6e04f6613fe0b398b5fdb63d5031c41a61848754086d24ae0dce85a9198c7b5df42f1ce69ffc0d2e31a2c6217b617df2263eeea549a47f296e20fd9b15433886e8dbfd05644aa4b7dc9b235713b61df453b4c9bcdb66dbacb07edb31e0da0a7aac1bf626cc581eee64763299c70ea1777d879d388fc9e58019922c923d3feb20425547e1d623681d214261044bcc120ad7abe0498eb3ef86f1c3a3d25fa811a521432acdfd973110f6eea8dca435a90453fc8fe39a9edf0c8f5c2904970ecc0fb91769d8ef2669f03052c7374de6036ea98a0694fade5785255f06d4f8bc78e1c745a0f94713e7d62fdc4f385a1d05788ae6ff339b290dda7ed8ac29674a05afbdf3ef2c0fb66e7cde144a9c17eb0b890bbe2ec19d3cc5100a9198e1b97f08bbce363748bb35d584b8048cee6ec70097402b063991b1e3fcdfe7a86c78d35997ceb151139496c08f5d4710a9c644b62b1f6289ea791c45ab8dec213281bd69d427105cf08cf099f733122cec7e1d63e9f80d3d683e9ea743a56b7206e282be4e8029cf2c0963667779363287d800ef9f73d743f64d865f7ca9f31f73cca325a059b8ac3bd06a9f90c688e148a9f5fbfe9774dea93ecef84788d39b55ed4d3884ac636bdb3abde4595a920d860ce96e120666614fed7cad4ffd31fd8c9a98c84cf3177799eb752720

0000000121a00c00611b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45e8c76c0c1c68ae202700f0c9d490b6ec68bf628358532dd81800898cd10b9444456c4baca3e9eb59c44b61721d6e157ead2cd0b934f9004e635a2b979d79dac12601ecc398146b7fab62ec48d2001581e7d19bd7214b7b83971342cd6445b7d2c0c677d12fd194d58c5bc7cfb9f1266b13e9e738794fb33399682c66c19ba487f9b80f7048dbb6dc0d30843c9b429264371cc1d28c2da37bec44de3fa2aae95d330dd51d7d564094be9eed89efa8e64b74e52aa4fc5cf1a7ff8dab44a51f1b73d268cd1269c7ba49d2297cc3d7bbde0b03961da3dbdd753e3d3860f8c390993ea8dc28c90644790e1d0c37280b7bfe376e16725666bb55800298666dae79eceec8c0bad77c5d42b9dce2a687f26a821376e9b083810cbb77f5a18287195809c986712b903924846e8e6279892db68d4646389ac3ddd41ffd7b07e8daebefe48b346f64f7191b1041e3c2fb61479c2c81017c161a1c3125bc5d085d70d407c708a1b9f586e4adf15f34fc02908f4f1be304fe15909ef093ba411f1c3c1cf313c9b0076286f4ae22464695929b836c422ce991e

0000000121a00e00711b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba684337ccb3d797471da66f466ab9d7f05cef44d8f36700d142876f8e8eda8fd39858d342fa4002772375979c29e2f07f281643ad3d8d2943b5b7525f0729bf2b83bbd96e4dbdb43c2a6a914ef4e76040e10bcd53fcfa1582f6eb1958aac3f666a3f6ad34ea790357a07ed43df4d7bc5e2b4e8e3881fc813ae73381a877dcc4543418e01e7e17f11dab9db2320be985cf0c9ad7c986278f5e1e0713d4df6444ab4e84fa059272b2274a95d5e4ad348da12e68bab1c703e0843b39dbbc30df3df9fafd498648d96ee05d3b57af8c6fc66bd7cf8cc34686e759f57fc133945ce9e5dcb34d112

0000000121a01000ff1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369727a24d5763e80c9cda7fe9774f44812f6f0b81ef5a420cca1e4fe343dd80dde1b30108f798b1215878e5be62a5a992daf1360df8f8eeb55c40bc8676aec4861af5dbefd11acafd8a30053640d7bbed6fdcb6670b41c39cfa6599da8d69ba32bd1b7b22c3e058ec2f0ac8cd8064897a01833b514132a5b2140f137d12ae8afeafe0b40ce39374b1d7a2bec92d9622ab71e50d8e22b0afdfc7a9fb5e104c9b16b5f776acaec448

0000000121a01200ef1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d712b4777e01b72d5346d1ca224accafb42c6f5e6fe81ee5528746b127d88a9a13516250b9d664c6aed9c8c2d3747aeecb47330ff6865b78b8aab05a3419ff57be2696c4a330d3b573f873d332743b10d4d1f60558e07259aa8f45ce9e5dcb34d112

0000000121a01400df1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a01600cf1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a01800bf1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a01a00af1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a01c009f1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a01e008f1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02001011b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02201111b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02401211b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02601311b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02801411b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02a01511b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02c01611b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a02e01711b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03001ff1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03201ef1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03401df1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03601cf1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03801bf1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03a01af1b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03c019e52e1f3819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a03e018bb8f3819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a04002011b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a04202111b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a04402211b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112

0000000121a04602311b819c401d5e9d39b1c58ca6e1754da837c66619ec8dd5b69fd79f09d00212878236175d7d23fbc534efc4baf39a61486da724e906db030d9b626642b31094ac0f96b405a4b7f45ba68428efa389ba814238cab633a9bca7369725363bcd5b9bfd0e09acfb91ae77ac077b3f0812e8e0bddd7ac97b8e871295741cbf4f01cd41967f64d9e1762eeed16c55fd95d8f4e0c93d227e05240a420644c0f7a8411298b242338ed10e3487ec31ffb7bc1f80222cb0202a92c82b6f3af4ca0a37a4f88fe0b66ce0cd3a92b27efd0e029b56f7af89e9237cf8e9446852759f03fc126d45629e5dcb34d112`

nozuonodienobb commented 2 years ago

this is my errorLog
`2022-01-01 13:25:31.428 18357-18446/com.byd.airplaylib E/ExoPlayerImplInternal: Playback error com.google.android.exoplayer2.ExoPlaybackException: Source error at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:554) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:193) at android.os.HandlerThread.run(HandlerThread.java:65) Caused by: com.google.android.exoplayer2.ParserException: Loading finished before preparation is complete. at com.google.android.exoplayer2.source.ProgressiveMediaPeriod.maybeThrowPrepareError(ProgressiveMediaPeriod.java:245) at com.google.android.exoplayer2.source.MaskingMediaPeriod.maybeThrowPrepareError(MaskingMediaPeriod.java:147) at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:909) at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:467) at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:193)  at android.os.HandlerThread.run(HandlerThread.java:65) 

2022-01-01 13:25:32.357 18357-18446/com.byd.airplaylib W/VideoCapabilities: Unrecognized profile 4 for video/hevc 2022-01-01 13:25:32.364 18357-18446/com.byd.airplaylib W/VideoCapabilities: Unsupported mime video/x-j2c 2022-01-01 13:25:32.370 18357-18446/com.byd.airplaylib W/VideoCapabilities: Unrecognized profile/level 0/3 for video/mpeg2 2022-01-01 13:25:32.387 18357-18446/com.byd.airplaylib W/VideoCapabilities: Unsupported mime video/x-flash-video 2022-01-01 13:25:32.429 18357-18446/com.byd.airplaylib I/VideoCapabilities: Unsupported profile 4 for video/mp4v-es 2022-01-01 13:25:32.449 18357-18446/com.byd.airplaylib W/MediaCodecUtil: Unknown AVC profile: 0 2022-01-01 13:25:32.450 18357-18446/com.byd.airplaylib W/MediaCodecUtil: Unknown AVC profile: 0 2022-01-01 13:25:32.451 18357-18446/com.byd.airplaylib D/MediaCodecInfo: AssumedSupport [sizeAndRate.rotated, 828x1792x-1.0] [OMX.google.h264.decoder, video/avc] [mek_8q, MEK-MX8Q, freescale, 28] 2022-01-01 13:25:32.451 18357-18446/com.byd.airplaylib W/MediaCodecUtil: Unknown AVC profile: 0 2022-01-01 13:25:32.457 18357-18446/com.byd.airplaylib I/chatty: uid=10012(com.byd.airplaylib) ExoPlayer:Playb identical 1 line 2022-01-01 13:25:32.457 18357-18446/com.byd.airplaylib W/MediaCodecUtil: Unknown AVC profile: 0 2022-01-01 13:25:32.458 18357-18446/com.byd.airplaylib D/MediaCodecInfo: AssumedSupport [sizeAndRate.rotated, 828x1792x-1.0] [OMX.google.h264.decoder, video/avc] [mek_8q, MEK-MX8Q, freescale, 28] 2022-01-01 13:25:32.458 18357-18446/com.byd.airplaylib W/MediaCodecUtil: Unknown AVC profile: 0 2022-01-01 13:25:32.473 18357-18446/com.byd.airplaylib I/chatty: uid=10012(com.byd.airplaylib) ExoPlayer:Playb identical 1 line 2022-01-01 13:25:32.474 18357-18446/com.byd.airplaylib W/MediaCodecUtil: Unknown AVC profile: 0 2022-01-01 13:25:32.474 18357-18446/com.byd.airplaylib D/MediaCodecInfo: AssumedSupport [sizeAndRate.rotated, 828x1792x-1.0] [OMX.google.h264.decoder, video/avc] [mek_8q, MEK-MX8Q, freescale, 28] 2022-01-01 13:25:32.480 18357-18471/com.byd.airplaylib I/OMXClient: IOmx service obtained 2022-01-01 13:25:32.494 18357-18470/com.byd.airplaylib D/SurfaceUtils: connecting to surface 0xfa6d60362010, reason connectToSurface 2022-01-01 13:25:32.495 18357-18470/com.byd.airplaylib I/MediaCodec: [OMX.Freescale.std.video_decoder.avc.v3.hw-based] setting surface generation to 18797569 2022-01-01 13:25:32.495 18357-18470/com.byd.airplaylib D/SurfaceUtils: disconnecting from surface 0xfa6d60362010, reason connectToSurface(reconnect) 2022-01-01 13:25:32.495 18357-18470/com.byd.airplaylib D/SurfaceUtils: connecting to surface 0xfa6d60362010, reason connectToSurface(reconnect) 2022-01-01 13:25:32.495 18357-18471/com.byd.airplaylib I/ACodec: Send reorder config(0) to VPU 2022-01-01 13:25:32.496 18357-18471/com.byd.airplaylib E/ACodec: disable AVC reorder failed 2022-01-01 13:25:32.496 18357-18471/com.byd.airplaylib E/ACodec: [OMX.Freescale.std.video_decoder.avc.v3.hw-based] setPortMode on output to DynamicANWBuffer failed w/ err -1010 2022-01-01 13:25:32.499 18357-18471/com.byd.airplaylib I/ACodec: codec does not support config priority (err -2147483648) 2022-01-01 13:25:32.500 18357-18471/com.byd.airplaylib W/ACodec: ACodec map vpu crop info: output crop: 1792, frameH 2048 2022-01-01 13:25:32.524 18357-18471/com.byd.airplaylib D/SurfaceUtils: disconnecting from surface 0xfa6d60362010, reason setNativeWindowSizeFormatAndUsage 2022-01-01 13:25:32.524 18357-18471/com.byd.airplaylib D/SurfaceUtils: connecting to surface 0xfa6d60362010, reason setNativeWindowSizeFormatAndUsage 2022-01-01 13:25:32.525 18357-18471/com.byd.airplaylib D/SurfaceUtils: set up nativeWindow 0xfa6d60362010 for 1024x2048, color 0x14, rotation 0, usage 0x40002900

`

nozuonodienobb commented 2 years ago

this is my datasource

public class APMirroringDataSource extends BaseDataSource {

private List data; @Nullable private Uri uri; private int readPosition; private int bytesRemaining; private boolean opened;

public APMirroringDataSource() { super(/ isNetwork= / false); data = new ArrayList<>(); }

public void addByte(byte [] bytes) { if (data == null) return; for (byte b : bytes) { data.add(Byte.valueOf(b)); } increaseBytesRemaining(bytes.length); }

@Override public long open(DataSpec dataSpec) throws IOException { uri = dataSpec.uri; transferInitializing(dataSpec); readPosition = (int) dataSpec.position; bytesRemaining = (int) ((dataSpec.length == C.LENGTH_UNSET) ? (data.size() - dataSpec.position) : dataSpec.length); if (bytesRemaining <= 0 || readPosition + bytesRemaining > data.size()) { throw new IOException("Unsatisfiable range: [" + readPosition + ", " + dataSpec.length

nozuonodienobb commented 2 years ago

this is my Extractor ``package com.byd.bydiosmirrorjava.mediasource;

import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.ts.TsPayloadReader; import com.google.android.exoplayer2.util.ParsableByteArray;

import java.io.IOException;

public class APMirroringExtractor implements Extractor {

/**

nozuonodienobb commented 2 years ago

I think my idea may be wrong, but I want to ask you how to play my H264 data source? thanks

nozuonodienobb commented 2 years ago

APMirroringH264Reader.txt APMirroringNalUnitTargetBuffer.txt mirrorDataSource.txt mirrorExtractor.txt MirrorExtractorFactory.txt MirroringDataSourceFactory.txt

nozuonodienobb commented 2 years ago

this is my useplace useActvityDemo.txt