Browse Source

第一次提交版本

ghost 4 years ago
parent
commit
5794bec228
100 changed files with 226359 additions and 0 deletions
  1. 674 0
      ffmpeg/LICENSE.txt
  2. 112 0
      ffmpeg/README.txt
  3. BIN
      ffmpeg/bin/ffmpeg.exe
  4. BIN
      ffmpeg/bin/ffplay.exe
  5. BIN
      ffmpeg/bin/ffprobe.exe
  6. 5 0
      ffmpeg/doc/bootstrap.min.css
  7. 165 0
      ffmpeg/doc/default.css
  8. 979 0
      ffmpeg/doc/developer.html
  9. 839 0
      ffmpeg/doc/faq.html
  10. 339 0
      ffmpeg/doc/fate.html
  11. 51219 0
      ffmpeg/doc/ffmpeg-all.html
  12. 961 0
      ffmpeg/doc/ffmpeg-bitstream-filters.html
  13. 6118 0
      ffmpeg/doc/ffmpeg-codecs.html
  14. 2461 0
      ffmpeg/doc/ffmpeg-devices.html
  15. 30840 0
      ffmpeg/doc/ffmpeg-filters.html
  16. 4428 0
      ffmpeg/doc/ffmpeg-formats.html
  17. 2225 0
      ffmpeg/doc/ffmpeg-protocols.html
  18. 372 0
      ffmpeg/doc/ffmpeg-resampler.html
  19. 267 0
      ffmpeg/doc/ffmpeg-scaler.html
  20. 1512 0
      ffmpeg/doc/ffmpeg-utils.html
  21. 2752 0
      ffmpeg/doc/ffmpeg.html
  22. 41782 0
      ffmpeg/doc/ffplay-all.html
  23. 860 0
      ffmpeg/doc/ffplay.html
  24. 42121 0
      ffmpeg/doc/ffprobe-all.html
  25. 1199 0
      ffmpeg/doc/ffprobe.html
  26. 1271 0
      ffmpeg/doc/general.html
  27. 519 0
      ffmpeg/doc/git-howto.html
  28. 84 0
      ffmpeg/doc/libavcodec.html
  29. 81 0
      ffmpeg/doc/libavdevice.html
  30. 80 0
      ffmpeg/doc/libavfilter.html
  31. 84 0
      ffmpeg/doc/libavformat.html
  32. 103 0
      ffmpeg/doc/libavutil.html
  33. 106 0
      ffmpeg/doc/libswresample.html
  34. 99 0
      ffmpeg/doc/libswscale.html
  35. 502 0
      ffmpeg/doc/mailing-list-faq.html
  36. 219 0
      ffmpeg/doc/nut.html
  37. 406 0
      ffmpeg/doc/platform.html
  38. 23 0
      ffmpeg/doc/style.min.css
  39. 394 0
      ffmpeg/presets/ffprobe.xsd
  40. 19 0
      ffmpeg/presets/libvpx-1080p.ffpreset
  41. 19 0
      ffmpeg/presets/libvpx-1080p50_60.ffpreset
  42. 18 0
      ffmpeg/presets/libvpx-360p.ffpreset
  43. 19 0
      ffmpeg/presets/libvpx-720p.ffpreset
  44. 19 0
      ffmpeg/presets/libvpx-720p50_60.ffpreset
  45. 22 0
      nginx-rtmp-win32-master/LICENSE
  46. 53 0
      nginx-rtmp-win32-master/README.md
  47. 83 0
      nginx-rtmp-win32-master/conf/mime.types
  48. 53 0
      nginx-rtmp-win32-master/conf/nginx.conf
  49. 21 0
      nginx-rtmp-win32-master/html/50x.html
  50. BIN
      nginx-rtmp-win32-master/html/GrindPlayer.swf
  51. BIN
      nginx-rtmp-win32-master/html/Main.swf
  52. 91 0
      nginx-rtmp-win32-master/html/ParsedQueryString.js
  53. 3 0
      nginx-rtmp-win32-master/html/crossdomain.xml
  54. BIN
      nginx-rtmp-win32-master/html/flashlsOSMF.swf
  55. 111 0
      nginx-rtmp-win32-master/html/index.html
  56. 355 0
      nginx-rtmp-win32-master/html/stat.xsl
  57. 4 0
      nginx-rtmp-win32-master/html/swfobject.js
  58. 126 0
      nginx-rtmp-win32-master/html/vod.html
  59. BIN
      nginx-rtmp-win32-master/nginx.exe
  60. 1 0
      nginx-rtmp-win32-master/stop.bat
  61. 0 0
      nginx-rtmp-win32-master/temp/temp.txt
  62. 107 0
      pom.xml
  63. 70 0
      postman/海康威视sdk测试.postman_collection.json
  64. 22 0
      src/main/java/com/example/demo/DemoApplication.java
  65. 241 0
      src/main/java/com/example/demo/entity/AjaxResult.java
  66. 13 0
      src/main/java/com/example/demo/entity/ListenFrom.java
  67. 558 0
      src/main/java/com/example/demo/hk/ClientDemo/ClientDemo.form
  68. 1464 0
      src/main/java/com/example/demo/hk/ClientDemo/ClientDemo.java
  69. 3332 0
      src/main/java/com/example/demo/hk/ClientDemo/HCNetSDK.java
  70. 639 0
      src/main/java/com/example/demo/hk/ClientDemo/HCNetTools.java
  71. 2452 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogAlarmCfg.form
  72. 2391 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogAlarmCfg.java
  73. 316 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogBasicConfig.form
  74. 393 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogBasicConfig.java
  75. 1082 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogChannelConfig.form
  76. 1251 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogChannelConfig.java
  77. 199 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogCheckTime.form
  78. 247 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogCheckTime.java
  79. 253 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogDeviceState.form
  80. 469 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogDeviceState.java
  81. 154 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogFormatDisk.form
  82. 299 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogFormatDisk.java
  83. 916 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogHideAlarm.form
  84. 1250 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogHideAlarm.java
  85. 119 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogHideArea.form
  86. 447 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogHideArea.java
  87. 338 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogIPAccessCfg.form
  88. 798 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogIPAccessCfg.java
  89. 972 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogMotionDetect.form
  90. 1394 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogMotionDetect.java
  91. 222 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogPTZCruise.form
  92. 264 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogPTZCruise.java
  93. 773 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBack.form
  94. 1144 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBack.java
  95. 523 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBackByTime.form
  96. 907 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBackByTime.java
  97. 1191 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogRecordSchedule.form
  98. 870 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogRecordSchedule.java
  99. 1061 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogSerialCfg.form
  100. 0 0
      src/main/java/com/example/demo/hk/ClientDemo/JDialogSerialCfg.java

+ 674 - 0
ffmpeg/LICENSE.txt

@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.

+ 112 - 0
ffmpeg/README.txt

@@ -0,0 +1,112 @@
+Zeranoe FFmpeg Builds <http://ffmpeg.zeranoe.com/builds/>
+
+Build: ffmpeg-20200608-d29aaf1-win64-static
+
+Configuration:
+  --enable-gpl
+  --enable-version3
+  --enable-sdl2
+  --enable-fontconfig
+  --enable-gnutls
+  --enable-iconv
+  --enable-libass
+  --enable-libdav1d
+  --enable-libbluray
+  --enable-libfreetype
+  --enable-libmp3lame
+  --enable-libopencore-amrnb
+  --enable-libopencore-amrwb
+  --enable-libopenjpeg
+  --enable-libopus
+  --enable-libshine
+  --enable-libsnappy
+  --enable-libsoxr
+  --enable-libsrt
+  --enable-libtheora
+  --enable-libtwolame
+  --enable-libvpx
+  --enable-libwavpack
+  --enable-libwebp
+  --enable-libx264
+  --enable-libx265
+  --enable-libxml2
+  --enable-libzimg
+  --enable-lzma
+  --enable-zlib
+  --enable-gmp
+  --enable-libvidstab
+  --enable-libvmaf
+  --enable-libvorbis
+  --enable-libvo-amrwbenc
+  --enable-libmysofa
+  --enable-libspeex
+  --enable-libxvid
+  --enable-libaom
+  --disable-w32threads
+  --enable-libmfx
+  --enable-ffnvcodec
+  --enable-cuda-llvm
+  --enable-cuvid
+  --enable-d3d11va
+  --enable-nvenc
+  --enable-nvdec
+  --enable-dxva2
+  --enable-avisynth
+  --enable-libopenmpt
+  --enable-amf
+
+Libraries:
+  SDL               20200522-599a852  <https://libsdl.org>
+  Fontconfig        2.13.92           <http://freedesktop.org/wiki/Software/fontconfig>
+  GnuTLS            3.6.13            <https://gnutls.org/>
+  libiconv          1.16              <http://gnu.org/software/libiconv>
+  libass            20200522-7c229bb  <https://github.com/libass/libass>
+  dav1d             20200520-df40d36  <https://code.videolan.org/videolan/dav1d>
+  libbluray         20200517-245baa7  <https://www.videolan.org/developers/libbluray.html>
+  FreeType          2.10.2            <http://freetype.sourceforge.net>
+  LAME              3.100             <http://lame.sourceforge.net>
+  OpenCORE AMR      20170731-07a5be4  <https://sourceforge.net/projects/opencore-amr>
+  OpenJPEG          20200520-19ef7f2  <https://github.com/uclouvain/openjpeg>
+  Opus              20200510-8aa7767  <https://opus-codec.org>
+  shine             20190420-76ea4f0  <https://github.com/savonet/shine>
+  Snappy            1.1.7             <https://github.com/google/snappy>
+  libsoxr           20180224-945b592  <http://sourceforge.net/projects/soxr>
+  SRT               20200520-9f7068d  <https://www.srtalliance.org>
+  Theora            20200225-31e885e  <http://theora.org>
+  TwoLAME           0.4.0             <http://twolame.org>
+  vpx               20200519-3bc58f1  <http://webmproject.org>
+  WavPack           5.3.0             <http://wavpack.com>
+  WebP              20200505-e3c259a  <https://developers.google.com/speed/webp>
+  x264              20200409-33f9e14  <https://www.videolan.org/developers/x264.html>
+  x265              20200506-1e3dbf0  <https://bitbucket.org/multicoreware/x265/wiki/Home>
+  libxml2           2.9.10            <http://xmlsoft.org>
+  z.lib             20200523-dbf72a8  <https://github.com/sekrit-twc/zimg>
+  XZ Utils          5.2.5             <http://tukaani.org/xz>
+  zlib              1.2.11            <http://zlib.net>
+  GMP               6.2.0             <https://gmplib.org>
+  vid.stab          20190213-aeabc8d  <http://public.hronopik.de/vid.stab>
+  VMAF              20200524-b22ec18  <https://github.com/Netflix/vmaf>
+  Vorbis            20200415-0a4beb1  <http://vorbis.com>
+  VisualOn AMR-WB   20141107-3b3fcd0  <https://sourceforge.net/projects/opencore-amr>
+  libmysofa         20200301-5c238dc  <https://github.com/hoene/libmysofa>
+  Speex             20181021-6e04bfa  <http://speex.org>
+  Xvid              1.3.5             <https://labs.xvid.com>
+  aom               20200522-a5e3f02  <https://aomedia.googlesource.com/aom>
+  libmfx            1.28              <https://software.intel.com/en-us/media-sdk>
+  nv-codec-headers  20191126-250292d  <https://git.videolan.org/?p=ffmpeg/nv-codec-headers.git>
+  AviSynth+         20200522-c5184c9  <https://github.com/AviSynth/AviSynthPlus>
+  OpenMPT           20200524-cb686d9  <https://openmpt.org>
+  AMF               20200515-802f92e  <https://gpuopen.com/gaming-product/advanced-media-framework>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.

BIN
ffmpeg/bin/ffmpeg.exe


BIN
ffmpeg/bin/ffplay.exe


BIN
ffmpeg/bin/ffprobe.exe


File diff suppressed because it is too large
+ 5 - 0
ffmpeg/doc/bootstrap.min.css


+ 165 - 0
ffmpeg/doc/default.css

@@ -0,0 +1,165 @@
+a.summary-letter {
+    text-decoration: none;
+}
+
+a {
+    color: #2D6198;
+}
+
+a:visited {
+    color: #884488;
+}
+
+#banner {
+    background-color: white;
+    position: relative;
+    text-align: center;
+}
+
+#banner img {
+    margin-bottom: 1px;
+    margin-top: 5px;
+}
+
+#body {
+    margin-left: 1em;
+    margin-right: 1em;
+}
+
+body {
+    background-color: #313131;
+    margin: 0;
+    text-align: justify;
+}
+
+.center {
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+}
+
+#container {
+    background-color: white;
+    color: #202020;
+    margin-left: 1em;
+    margin-right: 1em;
+}
+
+#footer {
+    text-align: center;
+}
+
+h1 a, h2 a, h3 a, h4 a {
+    text-decoration: inherit;
+    color: inherit;
+}
+
+h1, h2, h3, h4 {
+    padding-left: 0.4em;
+    border-radius: 4px;
+    padding-bottom: 0.25em;
+    padding-top: 0.25em;
+    border: 1px solid #6A996A;
+}
+
+h1 {
+    background-color: #7BB37B;
+    color: #151515;
+    font-size: 1.2em;
+    padding-bottom: 0.3em;
+    padding-top: 0.3em;
+}
+
+h2 {
+    color: #313131;
+    font-size: 1.0em;
+    background-color: #ABE3AB;
+}
+
+h3 {
+    color: #313131;
+    font-size: 0.9em;
+    margin-bottom: -6px;
+    background-color: #BBF3BB;
+}
+
+h4 {
+    color: #313131;
+    font-size: 0.8em;
+    margin-bottom: -8px;
+    background-color: #D1FDD1;
+}
+
+img {
+    border: 0;
+}
+
+#navbar {
+    background-color: #738073;
+    border-bottom: 1px solid #5C665C;
+    border-top: 1px solid #5C665C;
+    margin-top: 12px;
+    padding: 0.3em;
+    position: relative;
+    text-align: center;
+}
+
+#navbar a, #navbar_secondary a {
+    color: white;
+    padding: 0.3em;
+    text-decoration: none;
+}
+
+#navbar a:hover, #navbar_secondary a:hover {
+    background-color: #313131;
+    color: white;
+    text-decoration: none;
+}
+
+#navbar_secondary {
+    background-color: #738073;
+    border-bottom: 1px solid #5C665C;
+    border-left: 1px solid #5C665C;
+    border-right: 1px solid #5C665C;
+    padding: 0.3em;
+    position: relative;
+    text-align: center;
+}
+
+p {
+    margin-left: 1em;
+    margin-right: 1em;
+}
+
+pre {
+    margin-left: 3em;
+    margin-right: 3em;
+    padding: 0.3em;
+    border: 1px solid #bbb;
+    background-color: #f7f7f7;
+}
+
+dl dt {
+    font-weight: bold;
+}
+
+#proj_desc {
+    font-size: 1.2em;
+}
+
+#repos {
+    margin-left: 1em;
+    margin-right: 1em;
+    border-collapse: collapse;
+    border: solid 1px #6A996A;
+}
+
+#repos th {
+    background-color: #7BB37B;
+    border: solid 1px #6A996A;
+}
+
+#repos td {
+    padding: 0.2em;
+    border: solid 1px #6A996A;
+}

+ 979 - 0
ffmpeg/doc/developer.html

@@ -0,0 +1,979 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Developer Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Developer ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Developer Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Notes-for-external-developers" href="#Notes-for-external-developers">1 Notes for external developers</a></li>
+  <li><a name="toc-Contributing" href="#Contributing">2 Contributing</a></li>
+  <li><a name="toc-Coding-Rules-1" href="#Coding-Rules-1">3 Coding Rules</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Code-formatting-conventions" href="#Code-formatting-conventions">3.1 Code formatting conventions</a></li>
+    <li><a name="toc-Comments" href="#Comments">3.2 Comments</a></li>
+    <li><a name="toc-C-language-features" href="#C-language-features">3.3 C language features</a></li>
+    <li><a name="toc-Naming-conventions" href="#Naming-conventions">3.4 Naming conventions</a></li>
+    <li><a name="toc-Miscellaneous-conventions" href="#Miscellaneous-conventions">3.5 Miscellaneous conventions</a></li>
+    <li><a name="toc-Editor-configuration" href="#Editor-configuration">3.6 Editor configuration</a></li>
+  </ul></li>
+  <li><a name="toc-Development-Policy" href="#Development-Policy">4 Development Policy</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Patches_002fCommitting" href="#Patches_002fCommitting">4.1 Patches/Committing</a></li>
+    <li><a name="toc-Code" href="#Code">4.2 Code</a></li>
+    <li><a name="toc-Documentation_002fOther" href="#Documentation_002fOther">4.3 Documentation/Other</a></li>
+  </ul></li>
+  <li><a name="toc-Code-of-conduct" href="#Code-of-conduct">5 Code of conduct</a></li>
+  <li><a name="toc-Submitting-patches-1" href="#Submitting-patches-1">6 Submitting patches</a></li>
+  <li><a name="toc-New-codecs-or-formats-checklist" href="#New-codecs-or-formats-checklist">7 New codecs or formats checklist</a></li>
+  <li><a name="toc-Patch-submission-checklist" href="#Patch-submission-checklist">8 Patch submission checklist</a></li>
+  <li><a name="toc-Patch-review-process" href="#Patch-review-process">9 Patch review process</a></li>
+  <li><a name="toc-Regression-tests-1" href="#Regression-tests-1">10 Regression tests</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Adding-files-to-the-fate_002dsuite-dataset" href="#Adding-files-to-the-fate_002dsuite-dataset">10.1 Adding files to the fate-suite dataset</a></li>
+    <li><a name="toc-Visualizing-Test-Coverage" href="#Visualizing-Test-Coverage">10.2 Visualizing Test Coverage</a></li>
+    <li><a name="toc-Using-Valgrind" href="#Using-Valgrind">10.3 Using Valgrind</a></li>
+  </ul></li>
+  <li><a name="toc-Release-process-1" href="#Release-process-1">11 Release process</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Criteria-for-Point-Releases-1" href="#Criteria-for-Point-Releases-1">11.1 Criteria for Point Releases</a></li>
+    <li><a name="toc-Release-Checklist" href="#Release-Checklist">11.2 Release Checklist</a></li>
+  </ul>
+</li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Notes-for-external-developers"></a>
+<h1 class="chapter"><a href="developer.html#toc-Notes-for-external-developers">1 Notes for external developers</a></h1>
+
+<p>This document is mostly useful for internal FFmpeg developers.
+External developers who need to use the API in their application should
+refer to the API doxygen documentation in the public headers, and
+check the examples in &lsquo;<tt>doc/examples</tt>&rsquo; and in the source code to
+see how the public API is employed.
+</p>
+<p>You can use the FFmpeg libraries in your commercial program, but you
+are encouraged to <em>publish any patch you make</em>. In this case the
+best way to proceed is to send your patches to the ffmpeg-devel
+mailing list following the guidelines illustrated in the remainder of
+this document.
+</p>
+<p>For more detailed legal information about the use of FFmpeg in
+external programs read the &lsquo;<tt>LICENSE</tt>&rsquo; file in the source tree and
+consult <a href="https://ffmpeg.org/legal.html">https://ffmpeg.org/legal.html</a>.
+</p>
+<a name="Contributing"></a>
+<h1 class="chapter"><a href="developer.html#toc-Contributing">2 Contributing</a></h1>
+
+<p>There are 2 ways by which code gets into FFmpeg:
+</p><ul>
+<li> Submitting patches to the ffmpeg-devel mailing list.
+      See <a href="#Submitting-patches">Submitting patches</a> for details.
+</li><li> Directly committing changes to the main tree.
+</li></ul>
+
+<p>Whichever way, changes should be reviewed by the maintainer of the code
+before they are committed. And they should follow the <a href="#Coding-Rules">Coding Rules</a>.
+The developer making the commit and the author are responsible for their changes
+and should try to fix issues their commit causes.
+</p>
+<p><a name="Coding-Rules"></a>
+</p><a name="Coding-Rules-1"></a>
+<h1 class="chapter"><a href="developer.html#toc-Coding-Rules-1">3 Coding Rules</a></h1>
+
+<a name="Code-formatting-conventions"></a>
+<h2 class="section"><a href="developer.html#toc-Code-formatting-conventions">3.1 Code formatting conventions</a></h2>
+
+<p>There are the following guidelines regarding the indentation in files:
+</p>
+<ul>
+<li>
+Indent size is 4.
+
+</li><li>
+The TAB character is forbidden outside of Makefiles as is any
+form of trailing whitespace. Commits containing either will be
+rejected by the git repository.
+
+</li><li>
+You should try to limit your code lines to 80 characters; however, do so if
+and only if this improves readability.
+
+</li><li>
+K&amp;R coding style is used.
+</li></ul>
+<p>The presentation is one inspired by &rsquo;indent -i4 -kr -nut&rsquo;.
+</p>
+<p>The main priority in FFmpeg is simplicity and small code size in order to
+minimize the bug count.
+</p>
+<a name="Comments"></a>
+<h2 class="section"><a href="developer.html#toc-Comments">3.2 Comments</a></h2>
+<p>Use the JavaDoc/Doxygen  format (see examples below) so that code documentation
+can be generated automatically. All nontrivial functions should have a comment
+above them explaining what the function does, even if it is just one sentence.
+All structures and their member variables should be documented, too.
+</p>
+<p>Avoid Qt-style and similar Doxygen syntax with <code>!</code> in it, i.e. replace
+<code>//!</code> with <code>///</code> and similar.  Also @ syntax should be employed
+for markup commands, i.e. use <code>@param</code> and not <code>\param</code>.
+</p>
+<div class="example">
+<pre class="example">/**
+ * @file
+ * MPEG codec.
+ * @author ...
+ */
+
+/**
+ * Summary sentence.
+ * more text ...
+ * ...
+ */
+typedef struct Foobar {
+    int var1; /**&lt; var1 description */
+    int var2; ///&lt; var2 description
+    /** var3 description */
+    int var3;
+} Foobar;
+
+/**
+ * Summary sentence.
+ * more text ...
+ * ...
+ * @param my_parameter description of my_parameter
+ * @return return value description
+ */
+int myfunc(int my_parameter)
+...
+</pre></div>
+
+<a name="C-language-features"></a>
+<h2 class="section"><a href="developer.html#toc-C-language-features">3.3 C language features</a></h2>
+
+<p>FFmpeg is programmed in the ISO C90 language with a few additional
+features from ISO C99, namely:
+</p>
+<ul>
+<li>
+the &lsquo;<samp>inline</samp>&rsquo; keyword;
+
+</li><li>
+&lsquo;<samp>//</samp>&rsquo; comments;
+
+</li><li>
+designated struct initializers (&lsquo;<samp>struct s x = { .i = 17 };</samp>&rsquo;);
+
+</li><li>
+compound literals (&lsquo;<samp>x = (struct s) { 17, 23 };</samp>&rsquo;).
+
+</li><li>
+for loops with variable definition (&lsquo;<samp>for (int i = 0; i &lt; 8; i++)</samp>&rsquo;);
+
+</li><li>
+Variadic macros (&lsquo;<samp>#define ARRAY(nb, ...) (int[nb + 1]){ nb, __VA_ARGS__ }</samp>&rsquo;);
+
+</li><li>
+Implementation defined behavior for signed integers is assumed to match the
+expected behavior for two&rsquo;s complement. Non representable values in integer
+casts are binary truncated. Shift right of signed values uses sign extension.
+</li></ul>
+
+<p>These features are supported by all compilers we care about, so we will not
+accept patches to remove their use unless they absolutely do not impair
+clarity and performance.
+</p>
+<p>All code must compile with recent versions of GCC and a number of other
+currently supported compilers. To ensure compatibility, please do not use
+additional C99 features or GCC extensions. Especially watch out for:
+</p>
+<ul>
+<li>
+mixing statements and declarations;
+
+</li><li>
+&lsquo;<samp>long long</samp>&rsquo; (use &lsquo;<samp>int64_t</samp>&rsquo; instead);
+
+</li><li>
+&lsquo;<samp>__attribute__</samp>&rsquo; not protected by &lsquo;<samp>#ifdef __GNUC__</samp>&rsquo; or similar;
+
+</li><li>
+GCC statement expressions (&lsquo;<samp>(x = ({ int y = 4; y; })</samp>&rsquo;).
+</li></ul>
+
+<a name="Naming-conventions"></a>
+<h2 class="section"><a href="developer.html#toc-Naming-conventions">3.4 Naming conventions</a></h2>
+<p>All names should be composed with underscores (_), not CamelCase. For example,
+&lsquo;<samp>avfilter_get_video_buffer</samp>&rsquo; is an acceptable function name and
+&lsquo;<samp>AVFilterGetVideo</samp>&rsquo; is not. The exception from this are type names, like
+for example structs and enums; they should always be in CamelCase.
+</p>
+<p>There are the following conventions for naming variables and functions:
+</p>
+<ul>
+<li>
+For local variables no prefix is required.
+
+</li><li>
+For file-scope variables and functions declared as <code>static</code>, no prefix
+is required.
+
+</li><li>
+For variables and functions visible outside of file scope, but only used
+internally by a library, an <code>ff_</code> prefix should be used,
+e.g. &lsquo;<samp>ff_w64_demuxer</samp>&rsquo;.
+
+</li><li>
+For variables and functions visible outside of file scope, used internally
+across multiple libraries, use <code>avpriv_</code> as prefix, for example,
+&lsquo;<samp>avpriv_report_missing_feature</samp>&rsquo;.
+
+</li><li>
+Each library has its own prefix for public symbols, in addition to the
+commonly used <code>av_</code> (<code>avformat_</code> for libavformat,
+<code>avcodec_</code> for libavcodec, <code>swr_</code> for libswresample, etc).
+Check the existing code and choose names accordingly.
+Note that some symbols without these prefixes are also exported for
+retro-compatibility reasons. These exceptions are declared in the
+<code>lib&lt;name&gt;/lib&lt;name&gt;.v</code> files.
+</li></ul>
+
+<p>Furthermore, name space reserved for the system should not be invaded.
+Identifiers ending in <code>_t</code> are reserved by
+<a href="http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html#tag_02_02_02">POSIX</a>.
+Also avoid names starting with <code>__</code> or <code>_</code> followed by an uppercase
+letter as they are reserved by the C standard. Names starting with <code>_</code>
+are reserved at the file level and may not be used for externally visible
+symbols. If in doubt, just avoid names starting with <code>_</code> altogether.
+</p>
+<a name="Miscellaneous-conventions"></a>
+<h2 class="section"><a href="developer.html#toc-Miscellaneous-conventions">3.5 Miscellaneous conventions</a></h2>
+
+<ul>
+<li>
+fprintf and printf are forbidden in libavformat and libavcodec,
+please use av_log() instead.
+
+</li><li>
+Casts should be used only when necessary. Unneeded parentheses
+should also be avoided if they don&rsquo;t make the code easier to understand.
+</li></ul>
+
+<a name="Editor-configuration"></a>
+<h2 class="section"><a href="developer.html#toc-Editor-configuration">3.6 Editor configuration</a></h2>
+<p>In order to configure Vim to follow FFmpeg formatting conventions, paste
+the following snippet into your &lsquo;<tt>.vimrc</tt>&rsquo;:
+</p><div class="example">
+<pre class="example">&quot; indentation rules for FFmpeg: 4 spaces, no tabs
+set expandtab
+set shiftwidth=4
+set softtabstop=4
+set cindent
+set cinoptions=(0
+&quot; Allow tabs in Makefiles.
+autocmd FileType make,automake set noexpandtab shiftwidth=8 softtabstop=8
+&quot; Trailing whitespace and tabs are forbidden, so highlight them.
+highlight ForbiddenWhitespace ctermbg=red guibg=red
+match ForbiddenWhitespace /\s\+$\|\t/
+&quot; Do not highlight spaces at the end of line while typing on that line.
+autocmd InsertEnter * match ForbiddenWhitespace /\t\|\s\+\%#\@&lt;!$/
+</pre></div>
+
+<p>For Emacs, add these roughly equivalent lines to your &lsquo;<tt>.emacs.d/init.el</tt>&rsquo;:
+</p><div class="lisp">
+<pre class="lisp">(c-add-style &quot;ffmpeg&quot;
+             '(&quot;k&amp;r&quot;
+               (c-basic-offset . 4)
+               (indent-tabs-mode . nil)
+               (show-trailing-whitespace . t)
+               (c-offsets-alist
+                (statement-cont . (c-lineup-assignments +)))
+               )
+             )
+(setq c-default-style &quot;ffmpeg&quot;)
+</pre></div>
+
+<a name="Development-Policy"></a>
+<h1 class="chapter"><a href="developer.html#toc-Development-Policy">4 Development Policy</a></h1>
+
+<a name="Patches_002fCommitting"></a>
+<h2 class="section"><a href="developer.html#toc-Patches_002fCommitting">4.1 Patches/Committing</a></h2>
+<a name="Licenses-for-patches-must-be-compatible-with-FFmpeg_002e"></a>
+<h3 class="subheading">Licenses for patches must be compatible with FFmpeg.</h3>
+<p>Contributions should be licensed under the
+<a href="http://www.gnu.org/licenses/lgpl-2.1.html">LGPL 2.1</a>,
+including an &quot;or any later version&quot; clause, or, if you prefer
+a gift-style license, the
+<a href="http://opensource.org/licenses/isc-license.txt">ISC</a> or
+<a href="http://mit-license.org/">MIT</a> license.
+<a href="http://www.gnu.org/licenses/gpl-2.0.html">GPL 2</a> including
+an &quot;or any later version&quot; clause is also acceptable, but LGPL is
+preferred.
+If you add a new file, give it a proper license header. Do not copy and
+paste it from a random place, use an existing file as template.
+</p>
+<a name="You-must-not-commit-code-which-breaks-FFmpeg_0021"></a>
+<h3 class="subheading">You must not commit code which breaks FFmpeg!</h3>
+<p>This means unfinished code which is enabled and breaks compilation,
+or compiles but does not work/breaks the regression tests. Code which
+is unfinished but disabled may be permitted under-circumstances, like
+missing samples or an implementation with a small subset of features.
+Always check the mailing list for any reviewers with issues and test
+FATE before you push.
+</p>
+<a name="Keep-the-main-commit-message-short-with-an-extended-description-below_002e"></a>
+<h3 class="subheading">Keep the main commit message short with an extended description below.</h3>
+<p>The commit message should have a short first line in the form of
+a &lsquo;<samp>topic: short description</samp>&rsquo; as a header, separated by a newline
+from the body consisting of an explanation of why the change is necessary.
+If the commit fixes a known bug on the bug tracker, the commit message
+should include its bug ID. Referring to the issue on the bug tracker does
+not exempt you from writing an excerpt of the bug in the commit message.
+</p>
+<a name="Testing-must-be-adequate-but-not-excessive_002e"></a>
+<h3 class="subheading">Testing must be adequate but not excessive.</h3>
+<p>If it works for you, others, and passes FATE then it should be OK to commit
+it, provided it fits the other committing criteria. You should not worry about
+over-testing things. If your code has problems (portability, triggers
+compiler bugs, unusual environment etc) they will be reported and eventually
+fixed.
+</p>
+<a name="Do-not-commit-unrelated-changes-together_002e"></a>
+<h3 class="subheading">Do not commit unrelated changes together.</h3>
+<p>They should be split them into self-contained pieces. Also do not forget
+that if part B depends on part A, but A does not depend on B, then A can
+and should be committed first and separate from B. Keeping changes well
+split into self-contained parts makes reviewing and understanding them on
+the commit log mailing list easier. This also helps in case of debugging
+later on.
+Also if you have doubts about splitting or not splitting, do not hesitate to
+ask/discuss it on the developer mailing list.
+</p>
+<a name="Ask-before-you-change-the-build-system-_0028configure_002c-etc_0029_002e"></a>
+<h3 class="subheading">Ask before you change the build system (configure, etc).</h3>
+<p>Do not commit changes to the build system (Makefiles, configure script)
+which change behavior, defaults etc, without asking first. The same
+applies to compiler warning fixes, trivial looking fixes and to code
+maintained by other developers. We usually have a reason for doing things
+the way we do. Send your changes as patches to the ffmpeg-devel mailing
+list, and if the code maintainers say OK, you may commit. This does not
+apply to files you wrote and/or maintain.
+</p>
+<a name="Cosmetic-changes-should-be-kept-in-separate-patches_002e"></a>
+<h3 class="subheading">Cosmetic changes should be kept in separate patches.</h3>
+<p>We refuse source indentation and other cosmetic changes if they are mixed
+with functional changes, such commits will be rejected and removed. Every
+developer has his own indentation style, you should not change it. Of course
+if you (re)write something, you can use your own style, even though we would
+prefer if the indentation throughout FFmpeg was consistent (Many projects
+force a given indentation style - we do not.). If you really need to make
+indentation changes (try to avoid this), separate them strictly from real
+changes.
+</p>
+<p>NOTE: If you had to put if(){ .. } over a large (&gt; 5 lines) chunk of code,
+then either do NOT change the indentation of the inner part within (do not
+move it to the right)! or do so in a separate commit
+</p>
+<a name="Commit-messages-should-always-be-filled-out-properly_002e"></a>
+<h3 class="subheading">Commit messages should always be filled out properly.</h3>
+<p>Always fill out the commit log message. Describe in a few lines what you
+changed and why. You can refer to mailing list postings if you fix a
+particular bug. Comments such as &quot;fixed!&quot; or &quot;Changed it.&quot; are unacceptable.
+Recommended format:
+</p>
+<div class="example">
+<pre class="example">area changed: Short 1 line description
+
+details describing what and why and giving references.
+</pre></div>
+
+<a name="Credit-the-author-of-the-patch_002e"></a>
+<h3 class="subheading">Credit the author of the patch.</h3>
+<p>Make sure the author of the commit is set correctly. (see git commit &ndash;author)
+If you apply a patch, send an
+answer to ffmpeg-devel (or wherever you got the patch from) saying that
+you applied the patch.
+</p>
+<a name="Complex-patches-should-refer-to-discussion-surrounding-them_002e"></a>
+<h3 class="subheading">Complex patches should refer to discussion surrounding them.</h3>
+<p>When applying patches that have been discussed (at length) on the mailing
+list, reference the thread in the log message.
+</p>
+<a name="Always-wait-long-enough-before-pushing-changes"></a>
+<h3 class="subheading">Always wait long enough before pushing changes</h3>
+<p>Do NOT commit to code actively maintained by others without permission.
+Send a patch to ffmpeg-devel. If no one answers within a reasonable
+time-frame (12h for build failures and security fixes, 3 days small changes,
+1 week for big patches) then commit your patch if you think it is OK.
+Also note, the maintainer can simply ask for more time to review!
+</p>
+<a name="Code"></a>
+<h2 class="section"><a href="developer.html#toc-Code">4.2 Code</a></h2>
+<a name="API_002fABI-changes-should-be-discussed-before-they-are-made_002e"></a>
+<h3 class="subheading">API/ABI changes should be discussed before they are made.</h3>
+<p>Do not change behavior of the programs (renaming options etc) or public
+API or ABI without first discussing it on the ffmpeg-devel mailing list.
+Do not remove widely used functionality or features (redundant code can be removed).
+</p>
+<a name="Remember-to-check-if-you-need-to-bump-versions-for-libav_002a_002e"></a>
+<h3 class="subheading">Remember to check if you need to bump versions for libav*.</h3>
+<p>Depending on the change, you may need to change the version integer.
+Incrementing the first component means no backward compatibility to
+previous versions (e.g. removal of a function from the public API).
+Incrementing the second component means backward compatible change
+(e.g. addition of a function to the public API or extension of an
+existing data structure).
+Incrementing the third component means a noteworthy binary compatible
+change (e.g. encoder bug fix that matters for the decoder). The third
+component always starts at 100 to distinguish FFmpeg from Libav.
+</p>
+<a name="Warnings-for-correct-code-may-be-disabled-if-there-is-no-other-option_002e"></a>
+<h3 class="subheading">Warnings for correct code may be disabled if there is no other option.</h3>
+<p>Compiler warnings indicate potential bugs or code with bad style. If a type of
+warning always points to correct and clean code, that warning should
+be disabled, not the code changed.
+Thus the remaining warnings can either be bugs or correct code.
+If it is a bug, the bug has to be fixed. If it is not, the code should
+be changed to not generate a warning unless that causes a slowdown
+or obfuscates the code.
+</p>
+<a name="Check-untrusted-input-properly_002e"></a>
+<h3 class="subheading">Check untrusted input properly.</h3>
+<p>Never write to unallocated memory, never write over the end of arrays,
+always check values read from some untrusted source before using them
+as array index or other risky things.
+</p>
+<a name="Documentation_002fOther"></a>
+<h2 class="section"><a href="developer.html#toc-Documentation_002fOther">4.3 Documentation/Other</a></h2>
+<a name="Subscribe-to-the-ffmpeg_002ddevel-mailing-list_002e"></a>
+<h3 class="subheading">Subscribe to the ffmpeg-devel mailing list.</h3>
+<p>It is important to be subscribed to the
+<a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel">ffmpeg-devel</a>
+mailing list. Almost any non-trivial patch is to be sent there for review.
+Other developers may have comments about your contribution. We expect you see
+those comments, and to improve it if requested. (N.B. Experienced committers
+have other channels, and may sometimes skip review for trivial fixes.) Also,
+discussion here about bug fixes and FFmpeg improvements by other developers may
+be helpful information for you. Finally, by being a list subscriber, your
+contribution will be posted immediately to the list, without the moderation
+hold which messages from non-subscribers experience.
+</p>
+<p>However, it is more important to the project that we receive your patch than
+that you be subscribed to the ffmpeg-devel list. If you have a patch, and don&rsquo;t
+want to subscribe and discuss the patch, then please do send it to the list
+anyway.
+</p>
+<a name="Subscribe-to-the-ffmpeg_002dcvslog-mailing-list_002e"></a>
+<h3 class="subheading">Subscribe to the ffmpeg-cvslog mailing list.</h3>
+<p>Diffs of all commits are sent to the
+<a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-cvslog">ffmpeg-cvslog</a>
+mailing list. Some developers read this list to review all code base changes
+from all sources. Subscribing to this list is not mandatory.
+</p>
+<a name="Keep-the-documentation-up-to-date_002e"></a>
+<h3 class="subheading">Keep the documentation up to date.</h3>
+<p>Update the documentation if you change behavior or add features. If you are
+unsure how best to do this, send a patch to ffmpeg-devel, the documentation
+maintainer(s) will review and commit your stuff.
+</p>
+<a name="Important-discussions-should-be-accessible-to-all_002e"></a>
+<h3 class="subheading">Important discussions should be accessible to all.</h3>
+<p>Try to keep important discussions and requests (also) on the public
+developer mailing list, so that all developers can benefit from them.
+</p>
+<a name="Check-your-entries-in-MAINTAINERS_002e"></a>
+<h3 class="subheading">Check your entries in MAINTAINERS.</h3>
+<p>Make sure that no parts of the codebase that you maintain are missing from the
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; file. If something that you want to maintain is missing add it with
+your name after it.
+If at some point you no longer want to maintain some code, then please help in
+finding a new maintainer and also don&rsquo;t forget to update the &lsquo;<tt>MAINTAINERS</tt>&rsquo; file.
+</p>
+<p>We think our rules are not too hard. If you have comments, contact us.
+</p>
+<a name="Code-of-conduct"></a>
+<h1 class="chapter"><a href="developer.html#toc-Code-of-conduct">5 Code of conduct</a></h1>
+
+<p>Be friendly and respectful towards others and third parties.
+Treat others the way you yourself want to be treated.
+</p>
+<p>Be considerate. Not everyone shares the same viewpoint and priorities as you do.
+Different opinions and interpretations help the project.
+Looking at issues from a different perspective assists development.
+</p>
+<p>Do not assume malice for things that can be attributed to incompetence. Even if
+it is malice, it&rsquo;s rarely good to start with that as initial assumption.
+</p>
+<p>Stay friendly even if someone acts contrarily. Everyone has a bad day
+once in a while.
+If you yourself have a bad day or are angry then try to take a break and reply
+once you are calm and without anger if you have to.
+</p>
+<p>Try to help other team members and cooperate if you can.
+</p>
+<p>The goal of software development is to create technical excellence, not for any
+individual to be better and &quot;win&quot; against the others. Large software projects
+are only possible and successful through teamwork.
+</p>
+<p>If someone struggles do not put them down. Give them a helping hand
+instead and point them in the right direction.
+</p>
+<p>Finally, keep in mind the immortal words of Bill and Ted,
+&quot;Be excellent to each other.&quot;
+</p>
+<p><a name="Submitting-patches"></a>
+</p><a name="Submitting-patches-1"></a>
+<h1 class="chapter"><a href="developer.html#toc-Submitting-patches-1">6 Submitting patches</a></h1>
+
+<p>First, read the <a href="#Coding-Rules">Coding Rules</a> above if you did not yet, in particular
+the rules regarding patch submission.
+</p>
+<p>When you submit your patch, please use <code>git format-patch</code> or
+<code>git send-email</code>. We cannot read other diffs :-).
+</p>
+<p>Also please do not submit a patch which contains several unrelated changes.
+Split it into separate, self-contained pieces. This does not mean splitting
+file by file. Instead, make the patch as small as possible while still
+keeping it as a logical unit that contains an individual change, even
+if it spans multiple files. This makes reviewing your patches much easier
+for us and greatly increases your chances of getting your patch applied.
+</p>
+<p>Use the patcheck tool of FFmpeg to check your patch.
+The tool is located in the tools directory.
+</p>
+<p>Run the <a href="#Regression-tests">Regression tests</a> before submitting a patch in order to verify
+it does not cause unexpected problems.
+</p>
+<p>It also helps quite a bit if you tell us what the patch does (for example
+&rsquo;replaces lrint by lrintf&rsquo;), and why (for example &rsquo;*BSD isn&rsquo;t C99 compliant
+and has no lrint()&rsquo;)
+</p>
+<p>Also please if you send several patches, send each patch as a separate mail,
+do not attach several unrelated patches to the same mail.
+</p>
+<p>Patches should be posted to the
+<a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel">ffmpeg-devel</a>
+mailing list. Use <code>git send-email</code> when possible since it will properly
+send patches without requiring extra care. If you cannot, then send patches
+as base64-encoded attachments, so your patch is not trashed during
+transmission. Also ensure the correct mime type is used
+(text/x-diff or text/x-patch or at least text/plain) and that only one
+patch is inline or attached per mail.
+You can check <a href="https://patchwork.ffmpeg.org">https://patchwork.ffmpeg.org</a>, if your patch does not show up, its mime type
+likely was wrong.
+</p>
+<p>Your patch will be reviewed on the mailing list. You will likely be asked
+to make some changes and are expected to send in an improved version that
+incorporates the requests from the review. This process may go through
+several iterations. Once your patch is deemed good enough, some developer
+will pick it up and commit it to the official FFmpeg tree.
+</p>
+<p>Give us a few days to react. But if some time passes without reaction,
+send a reminder by email. Your patch should eventually be dealt with.
+</p>
+
+<a name="New-codecs-or-formats-checklist"></a>
+<h1 class="chapter"><a href="developer.html#toc-New-codecs-or-formats-checklist">7 New codecs or formats checklist</a></h1>
+
+<ol>
+<li>
+Did you use av_cold for codec initialization and close functions?
+
+</li><li>
+Did you add a long_name under NULL_IF_CONFIG_SMALL to the AVCodec or
+AVInputFormat/AVOutputFormat struct?
+
+</li><li>
+Did you bump the minor version number (and reset the micro version
+number) in &lsquo;<tt>libavcodec/version.h</tt>&rsquo; or &lsquo;<tt>libavformat/version.h</tt>&rsquo;?
+
+</li><li>
+Did you register it in &lsquo;<tt>allcodecs.c</tt>&rsquo; or &lsquo;<tt>allformats.c</tt>&rsquo;?
+
+</li><li>
+Did you add the AVCodecID to &lsquo;<tt>avcodec.h</tt>&rsquo;?
+When adding new codec IDs, also add an entry to the codec descriptor
+list in &lsquo;<tt>libavcodec/codec_desc.c</tt>&rsquo;.
+
+</li><li>
+If it has a FourCC, did you add it to &lsquo;<tt>libavformat/riff.c</tt>&rsquo;,
+even if it is only a decoder?
+
+</li><li>
+Did you add a rule to compile the appropriate files in the Makefile?
+Remember to do this even if you&rsquo;re just adding a format to a file that is
+already being compiled by some other rule, like a raw demuxer.
+
+</li><li>
+Did you add an entry to the table of supported formats or codecs in
+&lsquo;<tt>doc/general.texi</tt>&rsquo;?
+
+</li><li>
+Did you add an entry in the Changelog?
+
+</li><li>
+If it depends on a parser or a library, did you add that dependency in
+configure?
+
+</li><li>
+Did you <code>git add</code> the appropriate files before committing?
+
+</li><li>
+Did you make sure it compiles standalone, i.e. with
+<code>configure --disable-everything --enable-decoder=foo</code>
+(or <code>--enable-demuxer</code> or whatever your component is)?
+</li></ol>
+
+
+<a name="Patch-submission-checklist"></a>
+<h1 class="chapter"><a href="developer.html#toc-Patch-submission-checklist">8 Patch submission checklist</a></h1>
+
+<ol>
+<li>
+Does <code>make fate</code> pass with the patch applied?
+
+</li><li>
+Was the patch generated with git format-patch or send-email?
+
+</li><li>
+Did you sign-off your patch? (<code>git commit -s</code>)
+See <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/process/submitting-patches.rst">Sign your work</a> for the meaning
+of <em>sign-off</em>.
+
+</li><li>
+Did you provide a clear git commit log message?
+
+</li><li>
+Is the patch against latest FFmpeg git master branch?
+
+</li><li>
+Are you subscribed to ffmpeg-devel?
+(the list is subscribers only due to spam)
+
+</li><li>
+Have you checked that the changes are minimal, so that the same cannot be
+achieved with a smaller patch and/or simpler final code?
+
+</li><li>
+If the change is to speed critical code, did you benchmark it?
+
+</li><li>
+If you did any benchmarks, did you provide them in the mail?
+
+</li><li>
+Have you checked that the patch does not introduce buffer overflows or
+other security issues?
+
+</li><li>
+Did you test your decoder or demuxer against damaged data? If no, see
+tools/trasher, the noise bitstream filter, and
+<a href="http://caca.zoy.org/wiki/zzuf">zzuf</a>. Your decoder or demuxer
+should not crash, end in a (near) infinite loop, or allocate ridiculous
+amounts of memory when fed damaged data.
+
+</li><li>
+Did you test your decoder or demuxer against sample files?
+Samples may be obtained at <a href="https://samples.ffmpeg.org">https://samples.ffmpeg.org</a>.
+
+</li><li>
+Does the patch not mix functional and cosmetic changes?
+
+</li><li>
+Did you add tabs or trailing whitespace to the code? Both are forbidden.
+
+</li><li>
+Is the patch attached to the email you send?
+
+</li><li>
+Is the mime type of the patch correct? It should be text/x-diff or
+text/x-patch or at least text/plain and not application/octet-stream.
+
+</li><li>
+If the patch fixes a bug, did you provide a verbose analysis of the bug?
+
+</li><li>
+If the patch fixes a bug, did you provide enough information, including
+a sample, so the bug can be reproduced and the fix can be verified?
+Note please do not attach samples &gt;100k to mails but rather provide a
+URL, you can upload to <a href="https://streams.videolan.org/upload/">https://streams.videolan.org/upload/</a>.
+
+</li><li>
+Did you provide a verbose summary about what the patch does change?
+
+</li><li>
+Did you provide a verbose explanation why it changes things like it does?
+
+</li><li>
+Did you provide a verbose summary of the user visible advantages and
+disadvantages if the patch is applied?
+
+</li><li>
+Did you provide an example so we can verify the new feature added by the
+patch easily?
+
+</li><li>
+If you added a new file, did you insert a license header? It should be
+taken from FFmpeg, not randomly copied and pasted from somewhere else.
+
+</li><li>
+You should maintain alphabetical order in alphabetically ordered lists as
+long as doing so does not break API/ABI compatibility.
+
+</li><li>
+Lines with similar content should be aligned vertically when doing so
+improves readability.
+
+</li><li>
+Consider adding a regression test for your code.
+
+</li><li>
+If you added YASM code please check that things still work with &ndash;disable-yasm.
+
+</li><li>
+Make sure you check the return values of function and return appropriate
+error codes. Especially memory allocation functions like <code>av_malloc()</code>
+are notoriously left unchecked, which is a serious problem.
+
+</li><li>
+Test your code with valgrind and or Address Sanitizer to ensure it&rsquo;s free
+of leaks, out of array accesses, etc.
+</li></ol>
+
+<a name="Patch-review-process"></a>
+<h1 class="chapter"><a href="developer.html#toc-Patch-review-process">9 Patch review process</a></h1>
+
+<p>All patches posted to ffmpeg-devel will be reviewed, unless they contain a
+clear note that the patch is not for the git master branch.
+Reviews and comments will be posted as replies to the patch on the
+mailing list. The patch submitter then has to take care of every comment,
+that can be by resubmitting a changed patch or by discussion. Resubmitted
+patches will themselves be reviewed like any other patch. If at some point
+a patch passes review with no comments then it is approved, that can for
+simple and small patches happen immediately while large patches will generally
+have to be changed and reviewed many times before they are approved.
+After a patch is approved it will be committed to the repository.
+</p>
+<p>We will review all submitted patches, but sometimes we are quite busy so
+especially for large patches this can take several weeks.
+</p>
+<p>If you feel that the review process is too slow and you are willing to try to
+take over maintainership of the area of code you change then just clone
+git master and maintain the area of code there. We will merge each area from
+where its best maintained.
+</p>
+<p>When resubmitting patches, please do not make any significant changes
+not related to the comments received during review. Such patches will
+be rejected. Instead, submit significant changes or new features as
+separate patches.
+</p>
+<p>Everyone is welcome to review patches. Also if you are waiting for your patch
+to be reviewed, please consider helping to review other patches, that is a great
+way to get everyone&rsquo;s patches reviewed sooner.
+</p>
+<p><a name="Regression-tests"></a>
+</p><a name="Regression-tests-1"></a>
+<h1 class="chapter"><a href="developer.html#toc-Regression-tests-1">10 Regression tests</a></h1>
+
+<p>Before submitting a patch (or committing to the repository), you should at least
+test that you did not break anything.
+</p>
+<p>Running &rsquo;make fate&rsquo; accomplishes this, please see <a href="fate.html">fate.html</a> for details.
+</p>
+<p>[Of course, some patches may change the results of the regression tests. In
+this case, the reference results of the regression tests shall be modified
+accordingly].
+</p>
+<a name="Adding-files-to-the-fate_002dsuite-dataset"></a>
+<h2 class="section"><a href="developer.html#toc-Adding-files-to-the-fate_002dsuite-dataset">10.1 Adding files to the fate-suite dataset</a></h2>
+
+<p>When there is no muxer or encoder available to generate test media for a
+specific test then the media has to be included in the fate-suite.
+First please make sure that the sample file is as small as possible to test the
+respective decoder or demuxer sufficiently. Large files increase network
+bandwidth and disk space requirements.
+Once you have a working fate test and fate sample, provide in the commit
+message or introductory message for the patch series that you post to
+the ffmpeg-devel mailing list, a direct link to download the sample media.
+</p>
+<a name="Visualizing-Test-Coverage"></a>
+<h2 class="section"><a href="developer.html#toc-Visualizing-Test-Coverage">10.2 Visualizing Test Coverage</a></h2>
+
+<p>The FFmpeg build system allows visualizing the test coverage in an easy
+manner with the coverage tools <code>gcov</code>/<code>lcov</code>.  This involves
+the following steps:
+</p>
+<ol>
+<li>
+    Configure to compile with instrumentation enabled:
+    <code>configure --toolchain=gcov</code>.
+
+</li><li>
+    Run your test case, either manually or via FATE. This can be either
+    the full FATE regression suite, or any arbitrary invocation of any
+    front-end tool provided by FFmpeg, in any combination.
+
+</li><li>
+    Run <code>make lcov</code> to generate coverage data in HTML format.
+
+</li><li>
+    View <code>lcov/index.html</code> in your preferred HTML viewer.
+</li></ol>
+
+<p>You can use the command <code>make lcov-reset</code> to reset the coverage
+measurements. You will need to rerun <code>make lcov</code> after running a
+new test.
+</p>
+<a name="Using-Valgrind"></a>
+<h2 class="section"><a href="developer.html#toc-Using-Valgrind">10.3 Using Valgrind</a></h2>
+
+<p>The configure script provides a shortcut for using valgrind to spot bugs
+related to memory handling. Just add the option
+<code>--toolchain=valgrind-memcheck</code> or <code>--toolchain=valgrind-massif</code>
+to your configure line, and reasonable defaults will be set for running
+FATE under the supervision of either the <strong>memcheck</strong> or the
+<strong>massif</strong> tool of the valgrind suite.
+</p>
+<p>In case you need finer control over how valgrind is invoked, use the
+<code>--target-exec='valgrind &lt;your_custom_valgrind_options&gt;</code> option in
+your configure line instead.
+</p>
+<p><a name="Release-process"></a>
+</p><a name="Release-process-1"></a>
+<h1 class="chapter"><a href="developer.html#toc-Release-process-1">11 Release process</a></h1>
+
+<p>FFmpeg maintains a set of <strong>release branches</strong>, which are the
+recommended deliverable for system integrators and distributors (such as
+Linux distributions, etc.). At regular times, a <strong>release
+manager</strong> prepares, tests and publishes tarballs on the
+<a href="https://ffmpeg.org">https://ffmpeg.org</a> website.
+</p>
+<p>There are two kinds of releases:
+</p>
+<ol>
+<li>
+<strong>Major releases</strong> always include the latest and greatest
+features and functionality.
+
+</li><li>
+<strong>Point releases</strong> are cut from <strong>release</strong> branches,
+which are named <code>release/X</code>, with <code>X</code> being the release
+version number.
+</li></ol>
+
+<p>Note that we promise to our users that shared libraries from any FFmpeg
+release never break programs that have been <strong>compiled</strong> against
+previous versions of <strong>the same release series</strong> in any case!
+</p>
+<p>However, from time to time, we do make API changes that require adaptations
+in applications. Such changes are only allowed in (new) major releases and
+require further steps such as bumping library version numbers and/or
+adjustments to the symbol versioning file. Please discuss such changes
+on the <strong>ffmpeg-devel</strong> mailing list in time to allow forward planning.
+</p>
+<p><a name="Criteria-for-Point-Releases"></a>
+</p><a name="Criteria-for-Point-Releases-1"></a>
+<h2 class="section"><a href="developer.html#toc-Criteria-for-Point-Releases-1">11.1 Criteria for Point Releases</a></h2>
+
+<p>Changes that match the following criteria are valid candidates for
+inclusion into a point release:
+</p>
+<ol>
+<li>
+Fixes a security issue, preferably identified by a <strong>CVE
+number</strong> issued by <a href="http://cve.mitre.org/">http://cve.mitre.org/</a>.
+
+</li><li>
+Fixes a documented bug in <a href="https://trac.ffmpeg.org">https://trac.ffmpeg.org</a>.
+
+</li><li>
+Improves the included documentation.
+
+</li><li>
+Retains both source code and binary compatibility with previous
+point releases of the same release branch.
+</li></ol>
+
+<p>The order for checking the rules is (1 OR 2 OR 3) AND 4.
+</p>
+
+<a name="Release-Checklist"></a>
+<h2 class="section"><a href="developer.html#toc-Release-Checklist">11.2 Release Checklist</a></h2>
+
+<p>The release process involves the following steps:
+</p>
+<ol>
+<li>
+Ensure that the &lsquo;<tt>RELEASE</tt>&rsquo; file contains the version number for
+the upcoming release.
+
+</li><li>
+Add the release at <a href="https://trac.ffmpeg.org/admin/ticket/versions">https://trac.ffmpeg.org/admin/ticket/versions</a>.
+
+</li><li>
+Announce the intent to do a release to the mailing list.
+
+</li><li>
+Make sure all relevant security fixes have been backported. See
+<a href="https://ffmpeg.org/security.html">https://ffmpeg.org/security.html</a>.
+
+</li><li>
+Ensure that the FATE regression suite still passes in the release
+branch on at least <strong>i386</strong> and <strong>amd64</strong>
+(cf. <a href="#Regression-tests">Regression tests</a>).
+
+</li><li>
+Prepare the release tarballs in <code>bz2</code> and <code>gz</code> formats, and
+supplementing files that contain <code>gpg</code> signatures
+
+</li><li>
+Publish the tarballs at <a href="https://ffmpeg.org/releases">https://ffmpeg.org/releases</a>. Create and
+push an annotated tag in the form <code>nX</code>, with <code>X</code>
+containing the version number.
+
+</li><li>
+Propose and send a patch to the <strong>ffmpeg-devel</strong> mailing list
+with a news entry for the website.
+
+</li><li>
+Publish the news entry.
+
+</li><li>
+Send an announcement to the mailing list.
+</li></ol>
+
+    </div>
+  </body>
+</html>
+

+ 839 - 0
ffmpeg/doc/faq.html

@@ -0,0 +1,839 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="FFmpeg FAQ: ">
+<meta name="keywords" content="FFmpeg documentation : FFmpeg FAQ: ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">FFmpeg FAQ</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-General-Questions" href="#General-Questions">1 General Questions</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f" href="#Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f">1.1 Why doesn&rsquo;t FFmpeg support feature [xyz]?</a></li>
+    <li><a name="toc-FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f" href="#FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f">1.2 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?</a></li>
+    <li><a name="toc-I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e" href="#I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e">1.3 I cannot read this file although this format seems to be supported by ffmpeg.</a></li>
+    <li><a name="toc-Which-codecs-are-supported-by-Windows_003f" href="#Which-codecs-are-supported-by-Windows_003f">1.4 Which codecs are supported by Windows?</a></li>
+  </ul></li>
+  <li><a name="toc-Compilation" href="#Compilation">2 Compilation</a>
+  <ul class="no-bullet">
+    <li><a name="toc-error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027" href="#error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027">2.1 <code>error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'</code></a></li>
+    <li><a name="toc-I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f" href="#I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f">2.2 I have installed this library with my distro&rsquo;s package manager. Why does <code>configure</code> not see it?</a></li>
+    <li><a name="toc-How-do-I-make-pkg_002dconfig-find-my-libraries_003f" href="#How-do-I-make-pkg_002dconfig-find-my-libraries_003f">2.3 How do I make <code>pkg-config</code> find my libraries?</a></li>
+    <li><a name="toc-How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f" href="#How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f">2.4 How do I use <code>pkg-config</code> when cross-compiling?</a></li>
+  </ul></li>
+  <li><a name="toc-Usage" href="#Usage">3 Usage</a>
+  <ul class="no-bullet">
+    <li><a name="toc-ffmpeg-does-not-work_003b-what-is-wrong_003f" href="#ffmpeg-does-not-work_003b-what-is-wrong_003f">3.1 ffmpeg does not work; what is wrong?</a></li>
+    <li><a name="toc-How-do-I-encode-single-pictures-into-movies_003f" href="#How-do-I-encode-single-pictures-into-movies_003f">3.2 How do I encode single pictures into movies?</a></li>
+    <li><a name="toc-How-do-I-encode-movie-to-single-pictures_003f" href="#How-do-I-encode-movie-to-single-pictures_003f">3.3 How do I encode movie to single pictures?</a></li>
+    <li><a name="toc-Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f" href="#Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f">3.4 Why do I see a slight quality degradation with multithreaded MPEG* encoding?</a></li>
+    <li><a name="toc-How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f" href="#How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f">3.5 How can I read from the standard input or write to the standard output?</a></li>
+    <li><a name="toc-_002df-jpeg-doesn_0027t-work_002e" href="#g_t_002df-jpeg-doesn_0027t-work_002e">3.6 -f jpeg doesn&rsquo;t work.</a></li>
+    <li><a name="toc-Why-can-I-not-change-the-frame-rate_003f" href="#Why-can-I-not-change-the-frame-rate_003f">3.7 Why can I not change the frame rate?</a></li>
+    <li><a name="toc-How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f" href="#How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f">3.8 How do I encode Xvid or DivX video with ffmpeg?</a></li>
+    <li><a name="toc-Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f" href="#Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f">3.9 Which are good parameters for encoding high quality MPEG-4?</a></li>
+    <li><a name="toc-Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f" href="#Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f">3.10 Which are good parameters for encoding high quality MPEG-1/MPEG-2?</a></li>
+    <li><a name="toc-Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f" href="#Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f">3.11 Interlaced video looks very bad when encoded with ffmpeg, what is wrong?</a></li>
+    <li><a name="toc-How-can-I-read-DirectShow-files_003f" href="#How-can-I-read-DirectShow-files_003f">3.12 How can I read DirectShow files?</a></li>
+    <li><a name="toc-How-can-I-join-video-files_003f" href="#How-can-I-join-video-files_003f">3.13 How can I join video files?</a></li>
+    <li><a name="toc-How-can-I-concatenate-video-files_003f" href="#How-can-I-concatenate-video-files_003f">3.14 How can I concatenate video files?</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Concatenating-using-the-concat-filter" href="#Concatenating-using-the-concat-filter">3.14.1 Concatenating using the concat <em>filter</em></a></li>
+      <li><a name="toc-Concatenating-using-the-concat-demuxer" href="#Concatenating-using-the-concat-demuxer">3.14.2 Concatenating using the concat <em>demuxer</em></a></li>
+      <li><a name="toc-Concatenating-using-the-concat-protocol-_0028file-level_0029" href="#Concatenating-using-the-concat-protocol-_0028file-level_0029">3.14.3 Concatenating using the concat <em>protocol</em> (file level)</a></li>
+      <li><a name="toc-Concatenating-using-raw-audio-and-video" href="#Concatenating-using-raw-audio-and-video">3.14.4 Concatenating using raw audio and video</a></li>
+    </ul></li>
+    <li><a name="toc-Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e" href="#Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e">3.15 Using &lsquo;<samp>-f lavfi</samp>&rsquo;, audio becomes mono for no apparent reason.</a></li>
+    <li><a name="toc-Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f" href="#Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f">3.16 Why does FFmpeg not see the subtitles in my VOB file?</a></li>
+    <li><a name="toc-Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f" href="#Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f">3.17 Why was the <code>ffmpeg</code> &lsquo;<samp>-sameq</samp>&rsquo; option removed? What to use instead?</a></li>
+    <li><a name="toc-I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f" href="#I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f">3.18 I have a stretched video, why does scaling does not fix it?</a></li>
+    <li><a name="toc-How-do-I-run-ffmpeg-as-a-background-task_003f" href="#How-do-I-run-ffmpeg-as-a-background-task_003f">3.19 How do I run ffmpeg as a background task?</a></li>
+    <li><a name="toc-How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f" href="#How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f">3.20 How do I prevent ffmpeg from suspending with a message like <em>suspended (tty output)</em>?</a></li>
+  </ul></li>
+  <li><a name="toc-Development" href="#Development">4 Development</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f" href="#Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f">4.1 Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?</a></li>
+    <li><a name="toc-Can-you-support-my-C-compiler-XXX_003f" href="#Can-you-support-my-C-compiler-XXX_003f">4.2 Can you support my C compiler XXX?</a></li>
+    <li><a name="toc-Is-Microsoft-Visual-C_002b_002b-supported_003f" href="#Is-Microsoft-Visual-C_002b_002b-supported_003f">4.3 Is Microsoft Visual C++ supported?</a></li>
+    <li><a name="toc-Can-you-add-automake_002c-libtool-or-autoconf-support_003f" href="#Can-you-add-automake_002c-libtool-or-autoconf-support_003f">4.4 Can you add automake, libtool or autoconf support?</a></li>
+    <li><a name="toc-Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f" href="#Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f">4.5 Why not rewrite FFmpeg in object-oriented C++?</a></li>
+    <li><a name="toc-Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f" href="#Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f">4.6 Why are the ffmpeg programs devoid of debugging symbols?</a></li>
+    <li><a name="toc-I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f" href="#I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f">4.7 I do not like the LGPL, can I contribute code under the GPL instead?</a></li>
+    <li><a name="toc-I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e" href="#I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e">4.8 I&rsquo;m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.</a></li>
+    <li><a name="toc-I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e" href="#I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e">4.9 I&rsquo;m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.</a></li>
+    <li><a name="toc-I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope" href="#I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope">4.10 I&rsquo;m using libavutil from within my C++ application but the compiler complains about &rsquo;UINT64_C&rsquo; was not declared in this scope</a></li>
+    <li><a name="toc-I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f" href="#I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f">4.11 I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?</a></li>
+    <li><a name="toc-Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f" href="#Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f">4.12 Where is the documentation about ffv1, msmpeg4, asv1, 4xm?</a></li>
+    <li><a name="toc-How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f" href="#How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f">4.13 How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?</a></li>
+    <li><a name="toc-AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e" href="#AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e">4.14 AVStream.r_frame_rate is wrong, it is much larger than the frame rate.</a></li>
+    <li><a name="toc-Why-is-make-fate-not-running-all-tests_003f" href="#Why-is-make-fate-not-running-all-tests_003f">4.15 Why is <code>make fate</code> not running all tests?</a></li>
+    <li><a name="toc-Why-is-make-fate-not-finding-the-samples_003f" href="#Why-is-make-fate-not-finding-the-samples_003f">4.16 Why is <code>make fate</code> not finding the samples?</a></li>
+  </ul>
+</li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="General-Questions"></a>
+<h1 class="chapter"><a href="faq.html#toc-General-Questions">1 General Questions</a></h1>
+
+<a name="Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f">1.1 Why doesn&rsquo;t FFmpeg support feature [xyz]?</a></h2>
+
+<p>Because no one has taken on that task yet. FFmpeg development is
+driven by the tasks that are important to the individual developers.
+If there is a feature that is important to you, the best way to get
+it implemented is to undertake the task yourself or sponsor a developer.
+</p>
+<a name="FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f"></a>
+<h2 class="section"><a href="faq.html#toc-FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f">1.2 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?</a></h2>
+
+<p>No. Windows DLLs are not portable, bloated and often slow.
+Moreover FFmpeg strives to support all codecs natively.
+A DLL loader is not conducive to that goal.
+</p>
+<a name="I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e"></a>
+<h2 class="section"><a href="faq.html#toc-I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e">1.3 I cannot read this file although this format seems to be supported by ffmpeg.</a></h2>
+
+<p>Even if ffmpeg can read the container format, it may not support all its
+codecs. Please consult the supported codec list in the ffmpeg
+documentation.
+</p>
+<a name="Which-codecs-are-supported-by-Windows_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Which-codecs-are-supported-by-Windows_003f">1.4 Which codecs are supported by Windows?</a></h2>
+
+<p>Windows does not support standard formats like MPEG very well, unless you
+install some additional codecs.
+</p>
+<p>The following list of video codecs should work on most Windows systems:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>msmpeg4v2</samp>&rsquo;</dt>
+<dd><p>.avi/.asf
+</p></dd>
+<dt>&lsquo;<samp>msmpeg4</samp>&rsquo;</dt>
+<dd><p>.asf only
+</p></dd>
+<dt>&lsquo;<samp>wmv1</samp>&rsquo;</dt>
+<dd><p>.asf only
+</p></dd>
+<dt>&lsquo;<samp>wmv2</samp>&rsquo;</dt>
+<dd><p>.asf only
+</p></dd>
+<dt>&lsquo;<samp>mpeg4</samp>&rsquo;</dt>
+<dd><p>Only if you have some MPEG-4 codec like ffdshow or Xvid installed.
+</p></dd>
+<dt>&lsquo;<samp>mpeg1video</samp>&rsquo;</dt>
+<dd><p>.mpg only
+</p></dd>
+</dl>
+<p>Note, ASF files often have .wmv or .wma extensions in Windows. It should also
+be mentioned that Microsoft claims a patent on the ASF format, and may sue
+or threaten users who create ASF files with non-Microsoft software. It is
+strongly advised to avoid ASF where possible.
+</p>
+<p>The following list of audio codecs should work on most Windows systems:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>adpcm_ima_wav</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>adpcm_ms</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>pcm_s16le</samp>&rsquo;</dt>
+<dd><p>always
+</p></dd>
+<dt>&lsquo;<samp>libmp3lame</samp>&rsquo;</dt>
+<dd><p>If some MP3 codec like LAME is installed.
+</p></dd>
+</dl>
+
+
+<a name="Compilation"></a>
+<h1 class="chapter"><a href="faq.html#toc-Compilation">2 Compilation</a></h1>
+
+<a name="error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027"></a>
+<h2 class="section"><a href="faq.html#toc-error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027">2.1 <code>error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'</code></a></h2>
+
+<p>This is a bug in gcc. Do not report it to us. Instead, please report it to
+the gcc developers. Note that we will not add workarounds for gcc bugs.
+</p>
+<p>Also note that (some of) the gcc developers believe this is not a bug or
+not a bug they should fix:
+<a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203">https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203</a>.
+Then again, some of them do not know the difference between an undecidable
+problem and an NP-hard problem...
+</p>
+<a name="I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f"></a>
+<h2 class="section"><a href="faq.html#toc-I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f">2.2 I have installed this library with my distro&rsquo;s package manager. Why does <code>configure</code> not see it?</a></h2>
+
+<p>Distributions usually split libraries in several packages. The main package
+contains the files necessary to run programs using the library. The
+development package contains the files necessary to build programs using the
+library. Sometimes, docs and/or data are in a separate package too.
+</p>
+<p>To build FFmpeg, you need to install the development package. It is usually
+called &lsquo;<tt>libfoo-dev</tt>&rsquo; or &lsquo;<tt>libfoo-devel</tt>&rsquo;. You can remove it after the
+build is finished, but be sure to keep the main package.
+</p>
+<a name="How-do-I-make-pkg_002dconfig-find-my-libraries_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-make-pkg_002dconfig-find-my-libraries_003f">2.3 How do I make <code>pkg-config</code> find my libraries?</a></h2>
+
+<p>Somewhere along with your libraries, there is a &lsquo;<tt>.pc</tt>&rsquo; file (or several)
+in a &lsquo;<tt>pkgconfig</tt>&rsquo; directory. You need to set environment variables to
+point <code>pkg-config</code> to these files.
+</p>
+<p>If you need to <em>add</em> directories to <code>pkg-config</code>&rsquo;s search list
+(typical use case: library installed separately), add it to
+<code>$PKG_CONFIG_PATH</code>:
+</p>
+<div class="example">
+<pre class="example">export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
+</pre></div>
+
+<p>If you need to <em>replace</em> <code>pkg-config</code>&rsquo;s search list
+(typical use case: cross-compiling), set it in
+<code>$PKG_CONFIG_LIBDIR</code>:
+</p>
+<div class="example">
+<pre class="example">export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
+</pre></div>
+
+<p>If you need to know the library&rsquo;s internal dependencies (typical use: static
+linking), add the <code>--static</code> option to <code>pkg-config</code>:
+</p>
+<div class="example">
+<pre class="example">./configure --pkg-config-flags=--static
+</pre></div>
+
+<a name="How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f">2.4 How do I use <code>pkg-config</code> when cross-compiling?</a></h2>
+
+<p>The best way is to install <code>pkg-config</code> in your cross-compilation
+environment. It will automatically use the cross-compilation libraries.
+</p>
+<p>You can also use <code>pkg-config</code> from the host environment by
+specifying explicitly <code>--pkg-config=pkg-config</code> to <code>configure</code>.
+In that case, you must point <code>pkg-config</code> to the correct directories
+using the <code>PKG_CONFIG_LIBDIR</code>, as explained in the previous entry.
+</p>
+<p>As an intermediate solution, you can place in your cross-compilation
+environment a script that calls the host <code>pkg-config</code> with
+<code>PKG_CONFIG_LIBDIR</code> set. That script can look like that:
+</p>
+<div class="example">
+<pre class="example">#!/bin/sh
+PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
+export PKG_CONFIG_LIBDIR
+exec /usr/bin/pkg-config &quot;$@&quot;
+</pre></div>
+
+<a name="Usage"></a>
+<h1 class="chapter"><a href="faq.html#toc-Usage">3 Usage</a></h1>
+
+<a name="ffmpeg-does-not-work_003b-what-is-wrong_003f"></a>
+<h2 class="section"><a href="faq.html#toc-ffmpeg-does-not-work_003b-what-is-wrong_003f">3.1 ffmpeg does not work; what is wrong?</a></h2>
+
+<p>Try a <code>make distclean</code> in the ffmpeg source directory before the build.
+If this does not help see
+(<a href="https://ffmpeg.org/bugreports.html">https://ffmpeg.org/bugreports.html</a>).
+</p>
+<a name="How-do-I-encode-single-pictures-into-movies_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-encode-single-pictures-into-movies_003f">3.2 How do I encode single pictures into movies?</a></h2>
+
+<p>First, rename your pictures to follow a numerical sequence.
+For example, img1.jpg, img2.jpg, img3.jpg,...
+Then you may run:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
+</pre></div>
+
+<p>Notice that &lsquo;<samp>%d</samp>&rsquo; is replaced by the image number.
+</p>
+<p>&lsquo;<tt>img%03d.jpg</tt>&rsquo; means the sequence &lsquo;<tt>img001.jpg</tt>&rsquo;, &lsquo;<tt>img002.jpg</tt>&rsquo;, etc.
+</p>
+<p>Use the &lsquo;<samp>-start_number</samp>&rsquo; option to declare a starting number for
+the sequence. This is useful if your sequence does not start with
+&lsquo;<tt>img001.jpg</tt>&rsquo; but is still in a numerical order. The following
+example will start with &lsquo;<tt>img100.jpg</tt>&rsquo;:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
+</pre></div>
+
+<p>If you have large number of pictures to rename, you can use the
+following command to ease the burden. The command, using the bourne
+shell syntax, symbolically links all files in the current directory
+that match <code>*jpg</code> to the &lsquo;<tt>/tmp</tt>&rsquo; directory in the sequence of
+&lsquo;<tt>img001.jpg</tt>&rsquo;, &lsquo;<tt>img002.jpg</tt>&rsquo; and so on.
+</p>
+<div class="example">
+<pre class="example">x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s &quot;$i&quot; /tmp/img&quot;$counter&quot;.jpg; x=$(($x+1)); done
+</pre></div>
+
+<p>If you want to sequence them by oldest modified first, substitute
+<code>$(ls -r -t *jpg)</code> in place of <code>*jpg</code>.
+</p>
+<p>Then run:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
+</pre></div>
+
+<p>The same logic is used for any image format that ffmpeg reads.
+</p>
+<p>You can also use <code>cat</code> to pipe images to ffmpeg:
+</p>
+<div class="example">
+<pre class="example">cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
+</pre></div>
+
+<a name="How-do-I-encode-movie-to-single-pictures_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-encode-movie-to-single-pictures_003f">3.3 How do I encode movie to single pictures?</a></h2>
+
+<p>Use:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i movie.mpg movie%d.jpg
+</pre></div>
+
+<p>The &lsquo;<tt>movie.mpg</tt>&rsquo; used as input will be converted to
+&lsquo;<tt>movie1.jpg</tt>&rsquo;, &lsquo;<tt>movie2.jpg</tt>&rsquo;, etc...
+</p>
+<p>Instead of relying on file format self-recognition, you may also use
+</p><dl compact="compact">
+<dt>&lsquo;<samp>-c:v ppm</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>-c:v png</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>-c:v mjpeg</samp>&rsquo;</dt>
+</dl>
+<p>to force the encoding.
+</p>
+<p>Applying that to the previous example:
+</p><div class="example">
+<pre class="example">ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
+</pre></div>
+
+<p>Beware that there is no &quot;jpeg&quot; codec. Use &quot;mjpeg&quot; instead.
+</p>
+<a name="Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f">3.4 Why do I see a slight quality degradation with multithreaded MPEG* encoding?</a></h2>
+
+<p>For multithreaded MPEG* encoding, the encoded slices must be independent,
+otherwise thread n would practically have to wait for n-1 to finish, so it&rsquo;s
+quite logical that there is a small reduction of quality. This is not a bug.
+</p>
+<a name="How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f">3.5 How can I read from the standard input or write to the standard output?</a></h2>
+
+<p>Use &lsquo;<tt>-</tt>&rsquo; as file name.
+</p>
+<a name="g_t_002df-jpeg-doesn_0027t-work_002e"></a>
+<h2 class="section"><a href="faq.html#toc-_002df-jpeg-doesn_0027t-work_002e">3.6 -f jpeg doesn&rsquo;t work.</a></h2>
+
+<p>Try &rsquo;-f image2 test%d.jpg&rsquo;.
+</p>
+<a name="Why-can-I-not-change-the-frame-rate_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-can-I-not-change-the-frame-rate_003f">3.7 Why can I not change the frame rate?</a></h2>
+
+<p>Some codecs, like MPEG-1/2, only allow a small number of fixed frame rates.
+Choose a different codec with the -c:v command line option.
+</p>
+<a name="How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f">3.8 How do I encode Xvid or DivX video with ffmpeg?</a></h2>
+
+<p>Both Xvid and DivX (version 4+) are implementations of the ISO MPEG-4
+standard (note that there are many other coding formats that use this
+same standard). Thus, use &rsquo;-c:v mpeg4&rsquo; to encode in these formats. The
+default fourcc stored in an MPEG-4-coded file will be &rsquo;FMP4&rsquo;. If you want
+a different fourcc, use the &rsquo;-vtag&rsquo; option. E.g., &rsquo;-vtag xvid&rsquo; will
+force the fourcc &rsquo;xvid&rsquo; to be stored as the video fourcc rather than the
+default.
+</p>
+<a name="Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f">3.9 Which are good parameters for encoding high quality MPEG-4?</a></h2>
+
+<p>&rsquo;-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2&rsquo;,
+things to try: &rsquo;-bf 2&rsquo;, &rsquo;-mpv_flags qp_rd&rsquo;, &rsquo;-mpv_flags mv0&rsquo;, &rsquo;-mpv_flags skip_rd&rsquo;.
+</p>
+<a name="Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f">3.10 Which are good parameters for encoding high quality MPEG-1/MPEG-2?</a></h2>
+
+<p>&rsquo;-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2&rsquo;
+but beware the &rsquo;-g 100&rsquo; might cause problems with some decoders.
+Things to try: &rsquo;-bf 2&rsquo;, &rsquo;-mpv_flags qp_rd&rsquo;, &rsquo;-mpv_flags mv0&rsquo;, &rsquo;-mpv_flags skip_rd&rsquo;.
+</p>
+<a name="Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f">3.11 Interlaced video looks very bad when encoded with ffmpeg, what is wrong?</a></h2>
+
+<p>You should use &rsquo;-flags +ilme+ildct&rsquo; and maybe &rsquo;-flags +alt&rsquo; for interlaced
+material, and try &rsquo;-top 0/1&rsquo; if the result looks really messed-up.
+</p>
+<a name="How-can-I-read-DirectShow-files_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-can-I-read-DirectShow-files_003f">3.12 How can I read DirectShow files?</a></h2>
+
+<p>If you have built FFmpeg with <code>./configure --enable-avisynth</code>
+(only possible on MinGW/Cygwin platforms),
+then you may use any file that DirectShow can read as input.
+</p>
+<p>Just create an &quot;input.avs&quot; text file with this single line ...
+</p><div class="example">
+<pre class="example">DirectShowSource(&quot;C:\path to your file\yourfile.asf&quot;)
+</pre></div>
+<p>... and then feed that text file to ffmpeg:
+</p><div class="example">
+<pre class="example">ffmpeg -i input.avs
+</pre></div>
+
+<p>For ANY other help on AviSynth, please visit the
+<a href="http://www.avisynth.org/">AviSynth homepage</a>.
+</p>
+<a name="How-can-I-join-video-files_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-can-I-join-video-files_003f">3.13 How can I join video files?</a></h2>
+
+<p>To &quot;join&quot; video files is quite ambiguous. The following list explains the
+different kinds of &quot;joining&quot; and points out how those are addressed in
+FFmpeg. To join video files may mean:
+</p>
+<ul>
+<li>
+To put them one after the other: this is called to <em>concatenate</em> them
+(in short: concat) and is addressed
+<a href="#How-can-I-concatenate-video-files">in this very faq</a>.
+
+</li><li>
+To put them together in the same file, to let the user choose between the
+different versions (example: different audio languages): this is called to
+<em>multiplex</em> them together (in short: mux), and is done by simply
+invoking ffmpeg with several &lsquo;<samp>-i</samp>&rsquo; options.
+
+</li><li>
+For audio, to put all channels together in a single stream (example: two
+mono streams into one stereo stream): this is sometimes called to
+<em>merge</em> them, and can be done using the
+<a href="ffmpeg-filters.html#amerge"><code>amerge</code></a> filter.
+
+</li><li>
+For audio, to play one on top of the other: this is called to <em>mix</em>
+them, and can be done by first merging them into a single stream and then
+using the <a href="ffmpeg-filters.html#pan"><code>pan</code></a> filter to mix
+the channels at will.
+
+</li><li>
+For video, to display both together, side by side or one on top of a part of
+the other; it can be done using the
+<a href="ffmpeg-filters.html#overlay"><code>overlay</code></a> video filter.
+
+</li></ul>
+
+<p><a name="How-can-I-concatenate-video-files"></a>
+</p><a name="How-can-I-concatenate-video-files_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-can-I-concatenate-video-files_003f">3.14 How can I concatenate video files?</a></h2>
+
+<p>There are several solutions, depending on the exact circumstances.
+</p>
+<a name="Concatenating-using-the-concat-filter"></a>
+<h3 class="subsection"><a href="faq.html#toc-Concatenating-using-the-concat-filter">3.14.1 Concatenating using the concat <em>filter</em></a></h3>
+
+<p>FFmpeg has a <a href="ffmpeg-filters.html#concat"><code>concat</code></a> filter designed specifically for that, with examples in the
+documentation. This operation is recommended if you need to re-encode.
+</p>
+<a name="Concatenating-using-the-concat-demuxer"></a>
+<h3 class="subsection"><a href="faq.html#toc-Concatenating-using-the-concat-demuxer">3.14.2 Concatenating using the concat <em>demuxer</em></a></h3>
+
+<p>FFmpeg has a <a href="ffmpeg-formats.html#concat"><code>concat</code></a> demuxer which you can use when you want to avoid a re-encode and
+your format doesn&rsquo;t support file level concatenation.
+</p>
+<a name="Concatenating-using-the-concat-protocol-_0028file-level_0029"></a>
+<h3 class="subsection"><a href="faq.html#toc-Concatenating-using-the-concat-protocol-_0028file-level_0029">3.14.3 Concatenating using the concat <em>protocol</em> (file level)</a></h3>
+
+<p>FFmpeg has a <a href="ffmpeg-protocols.html#concat"><code>concat</code></a> protocol designed specifically for that, with examples in the
+documentation.
+</p>
+<p>A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow one to concatenate
+video by merely concatenating the files containing them.
+</p>
+<p>Hence you may concatenate your multimedia files by first transcoding them to
+these privileged formats, then using the humble <code>cat</code> command (or the
+equally humble <code>copy</code> under Windows), and finally transcoding back to your
+format of choice.
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
+ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
+cat intermediate1.mpg intermediate2.mpg &gt; intermediate_all.mpg
+ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
+</pre></div>
+
+<p>Additionally, you can use the <code>concat</code> protocol instead of <code>cat</code> or
+<code>copy</code> which will avoid creation of a potentially huge intermediate file.
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
+ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
+ffmpeg -i concat:&quot;intermediate1.mpg|intermediate2.mpg&quot; -c copy intermediate_all.mpg
+ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
+</pre></div>
+
+<p>Note that you may need to escape the character &quot;|&quot; which is special for many
+shells.
+</p>
+<p>Another option is usage of named pipes, should your platform support it:
+</p>
+<div class="example">
+<pre class="example">mkfifo intermediate1.mpg
+mkfifo intermediate2.mpg
+ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg &lt; /dev/null &amp;
+ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg &lt; /dev/null &amp;
+cat intermediate1.mpg intermediate2.mpg |\
+ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
+</pre></div>
+
+<a name="Concatenating-using-raw-audio-and-video"></a>
+<h3 class="subsection"><a href="faq.html#toc-Concatenating-using-raw-audio-and-video">3.14.4 Concatenating using raw audio and video</a></h3>
+
+<p>Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also
+allow concatenation, and the transcoding step is almost lossless.
+When using multiple yuv4mpegpipe(s), the first line needs to be discarded
+from all but the first stream. This can be accomplished by piping through
+<code>tail</code> as seen below. Note that when piping through <code>tail</code> you
+must use command grouping, <code>{  ;}</code>, to background properly.
+</p>
+<p>For example, let&rsquo;s say we want to concatenate two FLV files into an
+output.flv file:
+</p>
+<div class="example">
+<pre class="example">mkfifo temp1.a
+mkfifo temp1.v
+mkfifo temp2.a
+mkfifo temp2.v
+mkfifo all.a
+mkfifo all.v
+ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - &gt; temp1.a &lt; /dev/null &amp;
+ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - &gt; temp2.a &lt; /dev/null &amp;
+ffmpeg -i input1.flv -an -f yuv4mpegpipe - &gt; temp1.v &lt; /dev/null &amp;
+{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - &lt; /dev/null | tail -n +2 &gt; temp2.v ; } &amp;
+cat temp1.a temp2.a &gt; all.a &amp;
+cat temp1.v temp2.v &gt; all.v &amp;
+ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
+       -f yuv4mpegpipe -i all.v \
+       -y output.flv
+rm temp[12].[av] all.[av]
+</pre></div>
+
+<a name="Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e"></a>
+<h2 class="section"><a href="faq.html#toc-Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e">3.15 Using &lsquo;<samp>-f lavfi</samp>&rsquo;, audio becomes mono for no apparent reason.</a></h2>
+
+<p>Use &lsquo;<samp>-dumpgraph -</samp>&rsquo; to find out exactly where the channel layout is
+lost.
+</p>
+<p>Most likely, it is through <code>auto-inserted aresample</code>. Try to understand
+why the converting filter was needed at that place.
+</p>
+<p>Just before the output is a likely place, as &lsquo;<samp>-f lavfi</samp>&rsquo; currently
+only support packed S16.
+</p>
+<p>Then insert the correct <code>aformat</code> explicitly in the filtergraph,
+specifying the exact format.
+</p>
+<div class="example">
+<pre class="example">aformat=sample_fmts=s16:channel_layouts=stereo
+</pre></div>
+
+<a name="Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f">3.16 Why does FFmpeg not see the subtitles in my VOB file?</a></h2>
+
+<p>VOB and a few other formats do not have a global header that describes
+everything present in the file. Instead, applications are supposed to scan
+the file to see what it contains. Since VOB files are frequently large, only
+the beginning is scanned. If the subtitles happen only later in the file,
+they will not be initially detected.
+</p>
+<p>Some applications, including the <code>ffmpeg</code> command-line tool, can only
+work with streams that were detected during the initial scan; streams that
+are detected later are ignored.
+</p>
+<p>The size of the initial scan is controlled by two options: <code>probesize</code>
+(default ~5 Mo) and <code>analyzeduration</code> (default 5,000,000 µs = 5 s). For
+the subtitle stream to be detected, both values must be large enough.
+</p>
+<a name="Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f">3.17 Why was the <code>ffmpeg</code> &lsquo;<samp>-sameq</samp>&rsquo; option removed? What to use instead?</a></h2>
+
+<p>The &lsquo;<samp>-sameq</samp>&rsquo; option meant &quot;same quantizer&quot;, and made sense only in a
+very limited set of cases. Unfortunately, a lot of people mistook it for
+&quot;same quality&quot; and used it in places where it did not make sense: it had
+roughly the expected visible effect, but achieved it in a very inefficient
+way.
+</p>
+<p>Each encoder has its own set of options to set the quality-vs-size balance,
+use the options for the encoder you are using to set the quality level to a
+point acceptable for your tastes. The most common options to do that are
+&lsquo;<samp>-qscale</samp>&rsquo; and &lsquo;<samp>-qmax</samp>&rsquo;, but you should peruse the documentation
+of the encoder you chose.
+</p>
+<a name="I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f"></a>
+<h2 class="section"><a href="faq.html#toc-I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f">3.18 I have a stretched video, why does scaling does not fix it?</a></h2>
+
+<p>A lot of video codecs and formats can store the <em>aspect ratio</em> of the
+video: this is the ratio between the width and the height of either the full
+image (DAR, display aspect ratio) or individual pixels (SAR, sample aspect
+ratio). For example, EGA screens at resolution 640×350 had 4:3 DAR and 35:48
+SAR.
+</p>
+<p>Most still image processing work with square pixels, i.e. 1:1 SAR, but a lot
+of video standards, especially from the analogic-numeric transition era, use
+non-square pixels.
+</p>
+<p>Most processing filters in FFmpeg handle the aspect ratio to avoid
+stretching the image: cropping adjusts the DAR to keep the SAR constant,
+scaling adjusts the SAR to keep the DAR constant.
+</p>
+<p>If you want to stretch, or “unstretch”, the image, you need to override the
+information with the
+<a href="ffmpeg-filters.html#setdar_002c-setsar"><code>setdar or setsar filters</code></a>.
+</p>
+<p>Do not forget to examine carefully the original video to check whether the
+stretching comes from the image or from the aspect ratio information.
+</p>
+<p>For example, to fix a badly encoded EGA capture, use the following commands,
+either the first one to upscale to square pixels or the second one to set
+the correct aspect ratio or the third one to avoid transcoding (may not work
+depending on the format / codec / player / phase of the moon):
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
+ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
+ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
+</pre></div>
+
+<p><a name="background-task"></a>
+</p><a name="How-do-I-run-ffmpeg-as-a-background-task_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-run-ffmpeg-as-a-background-task_003f">3.19 How do I run ffmpeg as a background task?</a></h2>
+
+<p>ffmpeg normally checks the console input, for entries like &quot;q&quot; to stop
+and &quot;?&quot; to give help, while performing operations. ffmpeg does not have a way of
+detecting when it is running as a background task.
+When it checks the console input, that can cause the process running ffmpeg
+in the background to suspend.
+</p>
+<p>To prevent those input checks, allowing ffmpeg to run as a background task,
+use the <a href="ffmpeg.html#stdin-option"><code>-nostdin</code> option</a>
+in the ffmpeg invocation. This is effective whether you run ffmpeg in a shell
+or invoke ffmpeg in its own process via an operating system API.
+</p>
+<p>As an alternative, when you are running ffmpeg in a shell, you can redirect
+standard input to <code>/dev/null</code> (on Linux and macOS)
+or <code>NUL</code> (on Windows). You can do this redirect either
+on the ffmpeg invocation, or from a shell script which calls ffmpeg.
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -nostdin -i INPUT OUTPUT
+</pre></div>
+
+<p>or (on Linux, macOS, and other UNIX-like shells):
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i INPUT OUTPUT &lt;/dev/null
+</pre></div>
+
+<p>or (on Windows):
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i INPUT OUTPUT &lt;NUL
+</pre></div>
+
+<a name="How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f">3.20 How do I prevent ffmpeg from suspending with a message like <em>suspended (tty output)</em>?</a></h2>
+
+<p>If you run ffmpeg in the background, you may find that its process suspends.
+There may be a message like <em>suspended (tty output)</em>. The question is how
+to prevent the process from being suspended.
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">% ffmpeg -i INPUT OUTPUT &amp;&gt; ~/tmp/log.txt &amp;
+[1] 93352
+%
+[1]  + suspended (tty output)  ffmpeg -i INPUT OUTPUT &amp;&gt;
+</pre></div>
+
+<p>The message &quot;tty output&quot; notwithstanding, the problem here is that
+ffmpeg normally checks the console input when it runs. The operating system
+detects this, and suspends the process until you can bring it to the
+foreground and attend to it.
+</p>
+<p>The solution is to use the right techniques to tell ffmpeg not to consult
+console input. You can use the
+<a href="ffmpeg.html#stdin-option"><code>-nostdin</code> option</a>,
+or redirect standard input with <code>&lt; /dev/null</code>.
+See FAQ
+<a href="#background-task"><em>How do I run ffmpeg as a background task?</em></a>
+for details.
+</p>
+<a name="Development"></a>
+<h1 class="chapter"><a href="faq.html#toc-Development">4 Development</a></h1>
+
+<a name="Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f">4.1 Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?</a></h2>
+
+<p>Yes. Check the &lsquo;<tt>doc/examples</tt>&rsquo; directory in the source
+repository, also available online at:
+<a href="https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples">https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples</a>.
+</p>
+<p>Examples are also installed by default, usually in
+<code>$PREFIX/share/ffmpeg/examples</code>.
+</p>
+<p>Also you may read the Developers Guide of the FFmpeg documentation. Alternatively,
+examine the source code for one of the many open source projects that
+already incorporate FFmpeg at (<a href="projects.html">projects.html</a>).
+</p>
+<a name="Can-you-support-my-C-compiler-XXX_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Can-you-support-my-C-compiler-XXX_003f">4.2 Can you support my C compiler XXX?</a></h2>
+
+<p>It depends. If your compiler is C99-compliant, then patches to support
+it are likely to be welcome if they do not pollute the source code
+with <code>#ifdef</code>s related to the compiler.
+</p>
+<a name="Is-Microsoft-Visual-C_002b_002b-supported_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Is-Microsoft-Visual-C_002b_002b-supported_003f">4.3 Is Microsoft Visual C++ supported?</a></h2>
+
+<p>Yes. Please see the <a href="platform.html">Microsoft Visual C++</a>
+section in the FFmpeg documentation.
+</p>
+<a name="Can-you-add-automake_002c-libtool-or-autoconf-support_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Can-you-add-automake_002c-libtool-or-autoconf-support_003f">4.4 Can you add automake, libtool or autoconf support?</a></h2>
+
+<p>No. These tools are too bloated and they complicate the build.
+</p>
+<a name="Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f">4.5 Why not rewrite FFmpeg in object-oriented C++?</a></h2>
+
+<p>FFmpeg is already organized in a highly modular manner and does not need to
+be rewritten in a formal object language. Further, many of the developers
+favor straight C; it works for them. For more arguments on this matter,
+read <a href="https://web.archive.org/web/20111004021423/http://kernel.org/pub/linux/docs/lkml/#s15">&quot;Programming Religion&quot;</a>.
+</p>
+<a name="Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f">4.6 Why are the ffmpeg programs devoid of debugging symbols?</a></h2>
+
+<p>The build process creates <code>ffmpeg_g</code>, <code>ffplay_g</code>, etc. which
+contain full debug information. Those binaries are stripped to create
+<code>ffmpeg</code>, <code>ffplay</code>, etc. If you need the debug information, use
+the *_g versions.
+</p>
+<a name="I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f"></a>
+<h2 class="section"><a href="faq.html#toc-I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f">4.7 I do not like the LGPL, can I contribute code under the GPL instead?</a></h2>
+
+<p>Yes, as long as the code is optional and can easily and cleanly be placed
+under #if CONFIG_GPL without breaking anything. So, for example, a new codec
+or filter would be OK under GPL while a bug fix to LGPL code would not.
+</p>
+<a name="I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e"></a>
+<h2 class="section"><a href="faq.html#toc-I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e">4.8 I&rsquo;m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.</a></h2>
+
+<p>FFmpeg builds static libraries by default. In static libraries, dependencies
+are not handled. That has two consequences. First, you must specify the
+libraries in dependency order: <code>-lavdevice</code> must come before
+<code>-lavformat</code>, <code>-lavutil</code> must come after everything else, etc.
+Second, external libraries that are used in FFmpeg have to be specified too.
+</p>
+<p>An easy way to get the full list of required libraries in dependency order
+is to use <code>pkg-config</code>.
+</p>
+<div class="example">
+<pre class="example">c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
+</pre></div>
+
+<p>See &lsquo;<tt>doc/example/Makefile</tt>&rsquo; and &lsquo;<tt>doc/example/pc-uninstalled</tt>&rsquo; for
+more details.
+</p>
+<a name="I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e"></a>
+<h2 class="section"><a href="faq.html#toc-I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e">4.9 I&rsquo;m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.</a></h2>
+
+<p>FFmpeg is a pure C project, so to use the libraries within your C++ application
+you need to explicitly state that you are using a C library. You can do this by
+encompassing your FFmpeg includes using <code>extern &quot;C&quot;</code>.
+</p>
+<p>See <a href="http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3">http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3</a>
+</p>
+<a name="I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope"></a>
+<h2 class="section"><a href="faq.html#toc-I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope">4.10 I&rsquo;m using libavutil from within my C++ application but the compiler complains about &rsquo;UINT64_C&rsquo; was not declared in this scope</a></h2>
+
+<p>FFmpeg is a pure C project using C99 math features, in order to enable C++
+to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS
+</p>
+<a name="I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f"></a>
+<h2 class="section"><a href="faq.html#toc-I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f">4.11 I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?</a></h2>
+
+<p>You have to create a custom AVIOContext using <code>avio_alloc_context</code>,
+see &lsquo;<tt>libavformat/aviobuf.c</tt>&rsquo; in FFmpeg and &lsquo;<tt>libmpdemux/demux_lavf.c</tt>&rsquo; in MPlayer or MPlayer2 sources.
+</p>
+<a name="Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f">4.12 Where is the documentation about ffv1, msmpeg4, asv1, 4xm?</a></h2>
+
+<p>see <a href="https://www.ffmpeg.org/~michael/">https://www.ffmpeg.org/~michael/</a>
+</p>
+<a name="How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f"></a>
+<h2 class="section"><a href="faq.html#toc-How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f">4.13 How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?</a></h2>
+
+<p>Even if peculiar since it is network oriented, RTP is a container like any
+other. You have to <em>demux</em> RTP before feeding the payload to libavcodec.
+In this specific case please look at RFC 4629 to see how it should be done.
+</p>
+<a name="AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e"></a>
+<h2 class="section"><a href="faq.html#toc-AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e">4.14 AVStream.r_frame_rate is wrong, it is much larger than the frame rate.</a></h2>
+
+<p><code>r_frame_rate</code> is NOT the average frame rate, it is the smallest frame rate
+that can accurately represent all timestamps. So no, it is not
+wrong if it is larger than the average!
+For example, if you have mixed 25 and 30 fps content, then <code>r_frame_rate</code>
+will be 150 (it is the least common multiple).
+If you are looking for the average frame rate, see <code>AVStream.avg_frame_rate</code>.
+</p>
+<a name="Why-is-make-fate-not-running-all-tests_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-is-make-fate-not-running-all-tests_003f">4.15 Why is <code>make fate</code> not running all tests?</a></h2>
+
+<p>Make sure you have the fate-suite samples and the <code>SAMPLES</code> Make variable
+or <code>FATE_SAMPLES</code> environment variable or the <code>--samples</code>
+<code>configure</code> option is set to the right path.
+</p>
+<a name="Why-is-make-fate-not-finding-the-samples_003f"></a>
+<h2 class="section"><a href="faq.html#toc-Why-is-make-fate-not-finding-the-samples_003f">4.16 Why is <code>make fate</code> not finding the samples?</a></h2>
+
+<p>Do you happen to have a <code>~</code> character in the samples path to indicate a
+home directory? The value is used in ways where the shell cannot expand it,
+causing FATE to not find files. Just replace <code>~</code> by the full path.
+</p>
+    </div>
+  </body>
+</html>
+

+ 339 - 0
ffmpeg/doc/fate.html

@@ -0,0 +1,339 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="FFmpeg Automated Testing Environment: ">
+<meta name="keywords" content="FFmpeg documentation : FFmpeg Automated Testing Environment: ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">FFmpeg Automated Testing Environment</h1>
+<hr>
+<a name="Top"></a>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Introduction" href="#Introduction">1 Introduction</a></li>
+  <li><a name="toc-Using-FATE-from-your-FFmpeg-source-directory" href="#Using-FATE-from-your-FFmpeg-source-directory">2 Using FATE from your FFmpeg source directory</a></li>
+  <li><a name="toc-Submitting-the-results-to-the-FFmpeg-result-aggregation-server" href="#Submitting-the-results-to-the-FFmpeg-result-aggregation-server">3 Submitting the results to the FFmpeg result aggregation server</a></li>
+  <li><a name="toc-Uploading-new-samples-to-the-fate-suite" href="#Uploading-new-samples-to-the-fate-suite">4 Uploading new samples to the fate suite</a></li>
+  <li><a name="toc-FATE-makefile-targets-and-variables" href="#FATE-makefile-targets-and-variables">5 FATE makefile targets and variables</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Makefile-targets" href="#Makefile-targets">5.1 Makefile targets</a></li>
+    <li><a name="toc-Makefile-variables" href="#Makefile-variables">5.2 Makefile variables</a></li>
+    <li><a name="toc-Examples" href="#Examples">5.3 Examples</a></li>
+  </ul>
+</li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Introduction"></a>
+<h1 class="chapter"><a href="fate.html#toc-Introduction">1 Introduction</a></h1>
+
+<p>FATE is an extended regression suite on the client-side and a means
+for results aggregation and presentation on the server-side.
+</p>
+<p>The first part of this document explains how you can use FATE from
+your FFmpeg source directory to test your ffmpeg binary. The second
+part describes how you can run FATE to submit the results to FFmpeg&rsquo;s
+FATE server.
+</p>
+<p>In any way you can have a look at the publicly viewable FATE results
+by visiting this website:
+</p>
+<p><a href="http://fate.ffmpeg.org/">http://fate.ffmpeg.org/</a>
+</p>
+<p>This is especially recommended for all people contributing source
+code to FFmpeg, as it can be seen if some test on some platform broke
+with their recent contribution. This usually happens on the platforms
+the developers could not test on.
+</p>
+<p>The second part of this document describes how you can run FATE to
+submit your results to FFmpeg&rsquo;s FATE server. If you want to submit your
+results be sure to check that your combination of CPU, OS and compiler
+is not already listed on the above mentioned website.
+</p>
+<p>In the third part you can find a comprehensive listing of FATE makefile
+targets and variables.
+</p>
+
+<a name="Using-FATE-from-your-FFmpeg-source-directory"></a>
+<h1 class="chapter"><a href="fate.html#toc-Using-FATE-from-your-FFmpeg-source-directory">2 Using FATE from your FFmpeg source directory</a></h1>
+
+<p>If you want to run FATE on your machine you need to have the samples
+in place. You can get the samples via the build target fate-rsync.
+Use this command from the top-level source directory:
+</p>
+<div class="example">
+<pre class="example">make fate-rsync SAMPLES=fate-suite/
+make fate       SAMPLES=fate-suite/
+</pre></div>
+
+<p>The above commands set the samples location by passing a makefile
+variable via command line. It is also possible to set the samples
+location at source configuration time by invoking configure with
+&lsquo;<samp>--samples=&lt;path to the samples directory&gt;</samp>&rsquo;. Afterwards you can
+invoke the makefile targets without setting the <var>SAMPLES</var> makefile
+variable. This is illustrated by the following commands:
+</p>
+<div class="example">
+<pre class="example">./configure --samples=fate-suite/
+make fate-rsync
+make fate
+</pre></div>
+
+<p>Yet another way to tell FATE about the location of the sample
+directory is by making sure the environment variable FATE_SAMPLES
+contains the path to your samples directory. This can be achieved
+by e.g. putting that variable in your shell profile or by setting
+it in your interactive session.
+</p>
+<div class="example">
+<pre class="example">FATE_SAMPLES=fate-suite/ make fate
+</pre></div>
+
+<div class="float alert alert-info">
+<p>Do not put a &rsquo;~&rsquo; character in the samples path to indicate a home
+directory. Because of shell nuances, this will cause FATE to fail.
+</p></div>
+<p>To use a custom wrapper to run the test, pass &lsquo;<samp>--target-exec</samp>&rsquo; to
+<code>configure</code> or set the <var>TARGET_EXEC</var> Make variable.
+</p>
+
+<a name="Submitting-the-results-to-the-FFmpeg-result-aggregation-server"></a>
+<h1 class="chapter"><a href="fate.html#toc-Submitting-the-results-to-the-FFmpeg-result-aggregation-server">3 Submitting the results to the FFmpeg result aggregation server</a></h1>
+
+<p>To submit your results to the server you should run fate through the
+shell script &lsquo;<tt>tests/fate.sh</tt>&rsquo; from the FFmpeg sources. This script needs
+to be invoked with a configuration file as its first argument.
+</p>
+<div class="example">
+<pre class="example">tests/fate.sh /path/to/fate_config
+</pre></div>
+
+<p>A configuration file template with comments describing the individual
+configuration variables can be found at &lsquo;<tt>doc/fate_config.sh.template</tt>&rsquo;.
+</p>
+<p>The mentioned configuration template is also available here:
+</p><pre class="verbatim">slot=                                    # some unique identifier
+repo=git://source.ffmpeg.org/ffmpeg.git  # the source repository
+#branch=release/2.6                       # the branch to test
+samples=                                 # path to samples directory
+workdir=                                 # directory in which to do all the work
+#fate_recv=&quot;ssh -T fate@fate.ffmpeg.org&quot; # command to submit report
+comment=                                 # optional description
+build_only=     # set to &quot;yes&quot; for a compile-only instance that skips tests
+ignore_tests=
+
+# the following are optional and map to configure options
+arch=
+cpu=
+cross_prefix=
+as=
+cc=
+ld=
+target_os=
+sysroot=
+target_exec=
+target_path=
+target_samples=
+extra_cflags=
+extra_ldflags=
+extra_libs=
+extra_conf=     # extra configure options not covered above
+
+#make=          # name of GNU make if not 'make'
+makeopts=       # extra options passed to 'make'
+#makeopts_fate= # extra options passed to 'make' when running tests,
+                # defaulting to makeopts above if this is not set
+#tar=           # command to create a tar archive from its arguments on stdout,
+                # defaults to 'tar c'
+</pre>
+<p>Create a configuration that suits your needs, based on the configuration
+template. The <code>slot</code> configuration variable can be any string that is not
+yet used, but it is suggested that you name it adhering to the following
+pattern &lsquo;<samp><var>arch</var>-<var>os</var>-<var>compiler</var>-<var>compiler version</var></samp>&rsquo;. The
+configuration file itself will be sourced in a shell script, therefore all
+shell features may be used. This enables you to setup the environment as you
+need it for your build.
+</p>
+<p>For your first test runs the <code>fate_recv</code> variable should be empty or
+commented out. This will run everything as normal except that it will omit
+the submission of the results to the server. The following files should be
+present in $workdir as specified in the configuration file:
+</p>
+<ul>
+<li> configure.log
+    </li><li> compile.log
+    </li><li> test.log
+    </li><li> report
+    </li><li> version
+</li></ul>
+
+<p>When you have everything working properly you can create an SSH key pair
+and send the public key to the FATE server administrator who can be contacted
+at the email address <a href="mailto:fate-admin@ffmpeg.org">fate-admin@ffmpeg.org</a>.
+</p>
+<p>Configure your SSH client to use public key authentication with that key
+when connecting to the FATE server. Also do not forget to check the identity
+of the server and to accept its host key. This can usually be achieved by
+running your SSH client manually and killing it after you accepted the key.
+The FATE server&rsquo;s fingerprint is:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>RSA</samp>&rsquo;</dt>
+<dd><p>   d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
+</p></dd>
+<dt>&lsquo;<samp>ECDSA</samp>&rsquo;</dt>
+<dd><p>   76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
+</p></dd>
+</dl>
+
+<p>If you have problems connecting to the FATE server, it may help to try out
+the <code>ssh</code> command with one or more &lsquo;<samp>-v</samp>&rsquo; options. You should
+get detailed output concerning your SSH configuration and the authentication
+process.
+</p>
+<p>The only thing left is to automate the execution of the fate.sh script and
+the synchronisation of the samples directory.
+</p>
+<a name="Uploading-new-samples-to-the-fate-suite"></a>
+<h1 class="chapter"><a href="fate.html#toc-Uploading-new-samples-to-the-fate-suite">4 Uploading new samples to the fate suite</a></h1>
+
+<p>If you need a sample uploaded send a mail to samples-request.
+</p>
+<p>This is for developers who have an account on the fate suite server.
+If you upload new samples, please make sure they are as small as possible,
+space on each client, network bandwidth and so on benefit from smaller test cases.
+Also keep in mind older checkouts use existing sample files, that means in
+practice generally do not replace, remove or overwrite files as it likely would
+break older checkouts or releases.
+Also all needed samples for a commit should be uploaded, ideally 24
+hours, before the push.
+If you need an account for frequently uploading samples or you wish to help
+others by doing that send a mail to ffmpeg-devel.
+</p>
+<div class="example">
+<pre class="example">#First update your local samples copy:
+rsync -vauL --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X fate-suite.ffmpeg.org:/home/samples/fate-suite/ ~/fate-suite
+
+#Then do a dry run checking what would be uploaded:
+rsync -vanL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+
+#Upload the files:
+rsync -vaL  --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+</pre></div>
+
+
+<a name="FATE-makefile-targets-and-variables"></a>
+<h1 class="chapter"><a href="fate.html#toc-FATE-makefile-targets-and-variables">5 FATE makefile targets and variables</a></h1>
+
+<a name="Makefile-targets"></a>
+<h2 class="section"><a href="fate.html#toc-Makefile-targets">5.1 Makefile targets</a></h2>
+
+<dl compact="compact">
+<dt>&lsquo;<samp>fate-rsync</samp>&rsquo;</dt>
+<dd><p>Download/synchronize sample files to the configured samples directory.
+</p>
+</dd>
+<dt>&lsquo;<samp>fate-list</samp>&rsquo;</dt>
+<dd><p>Will list all fate/regression test targets.
+</p>
+</dd>
+<dt>&lsquo;<samp>fate</samp>&rsquo;</dt>
+<dd><p>Run the FATE test suite (requires the fate-suite dataset).
+</p></dd>
+</dl>
+
+<a name="Makefile-variables"></a>
+<h2 class="section"><a href="fate.html#toc-Makefile-variables">5.2 Makefile variables</a></h2>
+
+<dl compact="compact">
+<dt><code>V</code></dt>
+<dd><p>Verbosity level, can be set to 0, 1 or 2.
+    </p><ul>
+<li> 0: show just the test arguments
+        </li><li> 1: show just the command used in the test
+        </li><li> 2: show everything
+    </li></ul>
+
+</dd>
+<dt><code>SAMPLES</code></dt>
+<dd><p>Specify or override the path to the FATE samples at make time, it has a
+meaning only while running the regression tests.
+</p>
+</dd>
+<dt><code>THREADS</code></dt>
+<dd><p>Specify how many threads to use while running regression tests, it is
+quite useful to detect thread-related regressions.
+</p>
+</dd>
+<dt><code>THREAD_TYPE</code></dt>
+<dd><p>Specify which threading strategy test, either &lsquo;<samp>slice</samp>&rsquo; or &lsquo;<samp>frame</samp>&rsquo;,
+by default &lsquo;<samp>slice+frame</samp>&rsquo;
+</p>
+</dd>
+<dt><code>CPUFLAGS</code></dt>
+<dd><p>Specify CPU flags.
+</p>
+</dd>
+<dt><code>TARGET_EXEC</code></dt>
+<dd><p>Specify or override the wrapper used to run the tests.
+The <code>TARGET_EXEC</code> option provides a way to run FATE wrapped in
+<code>valgrind</code>, <code>qemu-user</code> or <code>wine</code> or on remote targets
+through <code>ssh</code>.
+</p>
+</dd>
+<dt><code>GEN</code></dt>
+<dd><p>Set to &lsquo;<samp>1</samp>&rsquo; to generate the missing or mismatched references.
+</p>
+</dd>
+<dt><code>HWACCEL</code></dt>
+<dd><p>Specify which hardware acceleration to use while running regression tests,
+by default &lsquo;<samp>none</samp>&rsquo; is used.
+</p>
+</dd>
+<dt><code>KEEP</code></dt>
+<dd><p>Set to &lsquo;<samp>1</samp>&rsquo; to keep temp files generated by fate test(s) when test is successful.
+Default is &lsquo;<samp>0</samp>&rsquo;, which removes these files. Files are always kept when a test
+fails.
+</p>
+</dd>
+</dl>
+
+<a name="Examples"></a>
+<h2 class="section"><a href="fate.html#toc-Examples">5.3 Examples</a></h2>
+
+<div class="example">
+<pre class="example">make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
+</pre></div>
+    </div>
+  </body>
+</html>
+

File diff suppressed because it is too large
+ 51219 - 0
ffmpeg/doc/ffmpeg-all.html


+ 961 - 0
ffmpeg/doc/ffmpeg-bitstream-filters.html

@@ -0,0 +1,961 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="FFmpeg Bitstream Filters Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : FFmpeg Bitstream Filters ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">FFmpeg Bitstream Filters Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-Bitstream-Filters" href="#Bitstream-Filters">2 Bitstream Filters</a>
+  <ul class="no-bullet">
+    <li><a name="toc-aac_005fadtstoasc" href="#aac_005fadtstoasc">2.1 aac_adtstoasc</a></li>
+    <li><a name="toc-av1_005fmetadata" href="#av1_005fmetadata">2.2 av1_metadata</a></li>
+    <li><a name="toc-chomp" href="#chomp">2.3 chomp</a></li>
+    <li><a name="toc-dca_005fcore" href="#dca_005fcore">2.4 dca_core</a></li>
+    <li><a name="toc-dump_005fextra" href="#dump_005fextra">2.5 dump_extra</a></li>
+    <li><a name="toc-eac3_005fcore" href="#eac3_005fcore">2.6 eac3_core</a></li>
+    <li><a name="toc-extract_005fextradata" href="#extract_005fextradata">2.7 extract_extradata</a></li>
+    <li><a name="toc-filter_005funits" href="#filter_005funits">2.8 filter_units</a></li>
+    <li><a name="toc-hapqa_005fextract" href="#hapqa_005fextract">2.9 hapqa_extract</a></li>
+    <li><a name="toc-h264_005fmetadata" href="#h264_005fmetadata">2.10 h264_metadata</a></li>
+    <li><a name="toc-h264_005fmp4toannexb" href="#h264_005fmp4toannexb">2.11 h264_mp4toannexb</a></li>
+    <li><a name="toc-h264_005fredundant_005fpps" href="#h264_005fredundant_005fpps">2.12 h264_redundant_pps</a></li>
+    <li><a name="toc-hevc_005fmetadata" href="#hevc_005fmetadata">2.13 hevc_metadata</a></li>
+    <li><a name="toc-hevc_005fmp4toannexb" href="#hevc_005fmp4toannexb">2.14 hevc_mp4toannexb</a></li>
+    <li><a name="toc-imxdump" href="#imxdump">2.15 imxdump</a></li>
+    <li><a name="toc-mjpeg2jpeg" href="#mjpeg2jpeg">2.16 mjpeg2jpeg</a></li>
+    <li><a name="toc-mjpegadump" href="#mjpegadump">2.17 mjpegadump</a></li>
+    <li><a name="toc-mov2textsub-1" href="#mov2textsub-1">2.18 mov2textsub</a></li>
+    <li><a name="toc-mp3decomp" href="#mp3decomp">2.19 mp3decomp</a></li>
+    <li><a name="toc-mpeg2_005fmetadata" href="#mpeg2_005fmetadata">2.20 mpeg2_metadata</a></li>
+    <li><a name="toc-mpeg4_005funpack_005fbframes" href="#mpeg4_005funpack_005fbframes">2.21 mpeg4_unpack_bframes</a></li>
+    <li><a name="toc-noise" href="#noise">2.22 noise</a></li>
+    <li><a name="toc-null" href="#null">2.23 null</a></li>
+    <li><a name="toc-pcm_005frechunk" href="#pcm_005frechunk">2.24 pcm_rechunk</a></li>
+    <li><a name="toc-prores_005fmetadata" href="#prores_005fmetadata">2.25 prores_metadata</a></li>
+    <li><a name="toc-remove_005fextra" href="#remove_005fextra">2.26 remove_extra</a></li>
+    <li><a name="toc-text2movsub-1" href="#text2movsub-1">2.27 text2movsub</a></li>
+    <li><a name="toc-trace_005fheaders" href="#trace_005fheaders">2.28 trace_headers</a></li>
+    <li><a name="toc-truehd_005fcore" href="#truehd_005fcore">2.29 truehd_core</a></li>
+    <li><a name="toc-vp9_005fmetadata" href="#vp9_005fmetadata">2.30 vp9_metadata</a></li>
+    <li><a name="toc-vp9_005fsuperframe" href="#vp9_005fsuperframe">2.31 vp9_superframe</a></li>
+    <li><a name="toc-vp9_005fsuperframe_005fsplit" href="#vp9_005fsuperframe_005fsplit">2.32 vp9_superframe_split</a></li>
+    <li><a name="toc-vp9_005fraw_005freorder" href="#vp9_005fraw_005freorder">2.33 vp9_raw_reorder</a></li>
+  </ul></li>
+  <li><a name="toc-See-Also" href="#See-Also">3 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">4 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="ffmpeg-bitstream-filters.html#toc-Description">1 Description</a></h1>
+
+<p>This document describes the bitstream filters provided by the
+libavcodec library.
+</p>
+<p>A bitstream filter operates on the encoded stream data, and performs
+bitstream level modifications without performing decoding.
+</p>
+
+<a name="Bitstream-Filters"></a>
+<h1 class="chapter"><a href="ffmpeg-bitstream-filters.html#toc-Bitstream-Filters">2 Bitstream Filters</a></h1>
+
+<p>When you configure your FFmpeg build, all the supported bitstream
+filters are enabled by default. You can list all available ones using
+the configure option <code>--list-bsfs</code>.
+</p>
+<p>You can disable all the bitstream filters using the configure option
+<code>--disable-bsfs</code>, and selectively enable any bitstream filter using
+the option <code>--enable-bsf=BSF</code>, or you can disable a particular
+bitstream filter using the option <code>--disable-bsf=BSF</code>.
+</p>
+<p>The option <code>-bsfs</code> of the ff* tools will display the list of
+all the supported bitstream filters included in your build.
+</p>
+<p>The ff* tools have a -bsf option applied per stream, taking a
+comma-separated list of filters, whose parameters follow the filter
+name after a &rsquo;=&rsquo;.
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1:opt2=str2][,filter2] OUTPUT
+</pre></div>
+
+<p>Below is a description of the currently available bitstream filters,
+with their parameters, if any.
+</p>
+<a name="aac_005fadtstoasc"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-aac_005fadtstoasc">2.1 aac_adtstoasc</a></h2>
+
+<p>Convert MPEG-2/4 AAC ADTS to an MPEG-4 Audio Specific Configuration
+bitstream.
+</p>
+<p>This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4
+ADTS header and removes the ADTS header.
+</p>
+<p>This filter is required for example when copying an AAC stream from a
+raw ADTS AAC or an MPEG-TS container to MP4A-LATM, to an FLV file, or
+to MOV/MP4 files and related formats such as 3GP or M4A. Please note
+that it is auto-inserted for MP4A-LATM and MOV/MP4 and related formats.
+</p>
+<a name="av1_005fmetadata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-av1_005fmetadata">2.2 av1_metadata</a></h2>
+
+<p>Modify metadata embedded in an AV1 stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>td</samp>&rsquo;</dt>
+<dd><p>Insert or remove temporal delimiter OBUs in all temporal units of the
+stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>insert</samp>&rsquo;</dt>
+<dd><p>Insert a TD at the beginning of every TU which does not already have one.
+</p></dd>
+<dt>&lsquo;<samp>remove</samp>&rsquo;</dt>
+<dd><p>Remove the TD from the beginning of every TU which has one.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>color_primaries</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>transfer_characteristics</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>matrix_coefficients</samp>&rsquo;</dt>
+<dd><p>Set the color description fields in the stream (see AV1 section 6.4.2).
+</p>
+</dd>
+<dt>&lsquo;<samp>color_range</samp>&rsquo;</dt>
+<dd><p>Set the color range in the stream (see AV1 section 6.4.2; note that
+this cannot be set for streams using BT.709 primaries, sRGB transfer
+characteristic and identity (RGB) matrix coefficients).
+</p><dl compact="compact">
+<dt>&lsquo;<samp>tv</samp>&rsquo;</dt>
+<dd><p>Limited range.
+</p></dd>
+<dt>&lsquo;<samp>pc</samp>&rsquo;</dt>
+<dd><p>Full range.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>chroma_sample_position</samp>&rsquo;</dt>
+<dd><p>Set the chroma sample location in the stream (see AV1 section 6.4.2).
+This can only be set for 4:2:0 streams.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>vertical</samp>&rsquo;</dt>
+<dd><p>Left position (matching the default in MPEG-2 and H.264).
+</p></dd>
+<dt>&lsquo;<samp>colocated</samp>&rsquo;</dt>
+<dd><p>Top-left position.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>tick_rate</samp>&rsquo;</dt>
+<dd><p>Set the tick rate (<em>num_units_in_display_tick / time_scale</em>) in
+the timing info in the sequence header.
+</p></dd>
+<dt>&lsquo;<samp>num_ticks_per_picture</samp>&rsquo;</dt>
+<dd><p>Set the number of ticks in each picture, to indicate that the stream
+has a fixed framerate.  Ignored if &lsquo;<samp>tick_rate</samp>&rsquo; is not also set.
+</p>
+</dd>
+<dt>&lsquo;<samp>delete_padding</samp>&rsquo;</dt>
+<dd><p>Deletes Padding OBUs.
+</p>
+</dd>
+</dl>
+
+<a name="chomp"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-chomp">2.3 chomp</a></h2>
+
+<p>Remove zero padding at the end of a packet.
+</p>
+<a name="dca_005fcore"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-dca_005fcore">2.4 dca_core</a></h2>
+
+<p>Extract the core from a DCA/DTS stream, dropping extensions such as
+DTS-HD.
+</p>
+<a name="dump_005fextra"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-dump_005fextra">2.5 dump_extra</a></h2>
+
+<p>Add extradata to the beginning of the filtered packets except when
+said packets already exactly begin with the extradata that is intended
+to be added.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>freq</samp>&rsquo;</dt>
+<dd><p>The additional argument specifies which packets should be filtered.
+It accepts the values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>k</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>keyframe</samp>&rsquo;</dt>
+<dd><p>add extradata to all key packets
+</p>
+</dd>
+<dt>&lsquo;<samp>e</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>all</samp>&rsquo;</dt>
+<dd><p>add extradata to all packets
+</p></dd>
+</dl>
+</dd>
+</dl>
+
+<p>If not specified it is assumed &lsquo;<samp>k</samp>&rsquo;.
+</p>
+<p>For example the following <code>ffmpeg</code> command forces a global
+header (thus disabling individual packet headers) in the H.264 packets
+generated by the <code>libx264</code> encoder, but corrects them by adding
+the header stored in extradata to the key packets:
+</p><div class="example">
+<pre class="example">ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
+</pre></div>
+
+<a name="eac3_005fcore"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-eac3_005fcore">2.6 eac3_core</a></h2>
+
+<p>Extract the core from a E-AC-3 stream, dropping extra channels.
+</p>
+<a name="extract_005fextradata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-extract_005fextradata">2.7 extract_extradata</a></h2>
+
+<p>Extract the in-band extradata.
+</p>
+<p>Certain codecs allow the long-term headers (e.g. MPEG-2 sequence headers,
+or H.264/HEVC (VPS/)SPS/PPS) to be transmitted either &quot;in-band&quot; (i.e. as a part
+of the bitstream containing the coded frames) or &quot;out of band&quot; (e.g. on the
+container level). This latter form is called &quot;extradata&quot; in FFmpeg terminology.
+</p>
+<p>This bitstream filter detects the in-band headers and makes them available as
+extradata.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>remove</samp>&rsquo;</dt>
+<dd><p>When this option is enabled, the long-term headers are removed from the
+bitstream after extraction.
+</p></dd>
+</dl>
+
+<a name="filter_005funits"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-filter_005funits">2.8 filter_units</a></h2>
+
+<p>Remove units with types in or not in a given set from the stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>pass_types</samp>&rsquo;</dt>
+<dd><p>List of unit types or ranges of unit types to pass through while removing
+all others.  This is specified as a &rsquo;|&rsquo;-separated list of unit type values
+or ranges of values with &rsquo;-&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>remove_types</samp>&rsquo;</dt>
+<dd><p>Identical to &lsquo;<samp>pass_types</samp>&rsquo;, except the units in the given set
+removed and all others passed through.
+</p></dd>
+</dl>
+
+<p>Extradata is unchanged by this transformation, but note that if the stream
+contains inline parameter sets then the output may be unusable if they are
+removed.
+</p>
+<p>For example, to remove all non-VCL NAL units from an H.264 stream:
+</p><div class="example">
+<pre class="example">ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=pass_types=1-5' OUTPUT
+</pre></div>
+
+<p>To remove all AUDs, SEI and filler from an H.265 stream:
+</p><div class="example">
+<pre class="example">ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=35|38-40' OUTPUT
+</pre></div>
+
+<a name="hapqa_005fextract"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-hapqa_005fextract">2.9 hapqa_extract</a></h2>
+
+<p>Extract Rgb or Alpha part of an HAPQA file, without recompression, in order to create an HAPQ or an HAPAlphaOnly file.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>texture</samp>&rsquo;</dt>
+<dd><p>Specifies the texture to keep.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>color</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>alpha</samp>&rsquo;</dt>
+</dl>
+
+</dd>
+</dl>
+
+<p>Convert HAPQA to HAPQ
+</p><div class="example">
+<pre class="example">ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=color -tag:v HapY -metadata:s:v:0 encoder=&quot;HAPQ&quot; hapq_file.mov
+</pre></div>
+
+<p>Convert HAPQA to HAPAlphaOnly
+</p><div class="example">
+<pre class="example">ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=alpha -tag:v HapA -metadata:s:v:0 encoder=&quot;HAPAlpha Only&quot; hapalphaonly_file.mov
+</pre></div>
+
+<a name="h264_005fmetadata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-h264_005fmetadata">2.10 h264_metadata</a></h2>
+
+<p>Modify metadata embedded in an H.264 stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>aud</samp>&rsquo;</dt>
+<dd><p>Insert or remove AUD NAL units in all access units of the stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>insert</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>remove</samp>&rsquo;</dt>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>sample_aspect_ratio</samp>&rsquo;</dt>
+<dd><p>Set the sample aspect ratio of the stream in the VUI parameters.
+</p>
+</dd>
+<dt>&lsquo;<samp>overscan_appropriate_flag</samp>&rsquo;</dt>
+<dd><p>Set whether the stream is suitable for display using overscan
+or not (see H.264 section E.2.1).
+</p>
+</dd>
+<dt>&lsquo;<samp>video_format</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>video_full_range_flag</samp>&rsquo;</dt>
+<dd><p>Set the video format in the stream (see H.264 section E.2.1 and
+table E-2).
+</p>
+</dd>
+<dt>&lsquo;<samp>colour_primaries</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>transfer_characteristics</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>matrix_coefficients</samp>&rsquo;</dt>
+<dd><p>Set the colour description in the stream (see H.264 section E.2.1
+and tables E-3, E-4 and E-5).
+</p>
+</dd>
+<dt>&lsquo;<samp>chroma_sample_loc_type</samp>&rsquo;</dt>
+<dd><p>Set the chroma sample location in the stream (see H.264 section
+E.2.1 and figure E-1).
+</p>
+</dd>
+<dt>&lsquo;<samp>tick_rate</samp>&rsquo;</dt>
+<dd><p>Set the tick rate (num_units_in_tick / time_scale) in the VUI
+parameters.  This is the smallest time unit representable in the
+stream, and in many cases represents the field rate of the stream
+(double the frame rate).
+</p></dd>
+<dt>&lsquo;<samp>fixed_frame_rate_flag</samp>&rsquo;</dt>
+<dd><p>Set whether the stream has fixed framerate - typically this indicates
+that the framerate is exactly half the tick rate, but the exact
+meaning is dependent on interlacing and the picture structure (see
+H.264 section E.2.1 and table E-6).
+</p>
+</dd>
+<dt>&lsquo;<samp>crop_left</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>crop_right</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>crop_top</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>crop_bottom</samp>&rsquo;</dt>
+<dd><p>Set the frame cropping offsets in the SPS.  These values will replace
+the current ones if the stream is already cropped.
+</p>
+<p>These fields are set in pixels.  Note that some sizes may not be
+representable if the chroma is subsampled or the stream is interlaced
+(see H.264 section 7.4.2.1.1).
+</p>
+</dd>
+<dt>&lsquo;<samp>sei_user_data</samp>&rsquo;</dt>
+<dd><p>Insert a string as SEI unregistered user data.  The argument must
+be of the form <em>UUID+string</em>, where the UUID is as hex digits
+possibly separated by hyphens, and the string can be anything.
+</p>
+<p>For example, &lsquo;<samp>086f3693-b7b3-4f2c-9653-21492feee5b8+hello</samp>&rsquo; will
+insert the string &ldquo;hello&rdquo; associated with the given UUID.
+</p>
+</dd>
+<dt>&lsquo;<samp>delete_filler</samp>&rsquo;</dt>
+<dd><p>Deletes both filler NAL units and filler SEI messages.
+</p>
+</dd>
+<dt>&lsquo;<samp>level</samp>&rsquo;</dt>
+<dd><p>Set the level in the SPS.  Refer to H.264 section A.3 and tables A-1
+to A-5.
+</p>
+<p>The argument must be the name of a level (for example, &lsquo;<samp>4.2</samp>&rsquo;), a
+level_idc value (for example, &lsquo;<samp>42</samp>&rsquo;), or the special name &lsquo;<samp>auto</samp>&rsquo;
+indicating that the filter should attempt to guess the level from the
+input stream properties.
+</p>
+</dd>
+</dl>
+
+<a name="h264_005fmp4toannexb"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-h264_005fmp4toannexb">2.11 h264_mp4toannexb</a></h2>
+
+<p>Convert an H.264 bitstream from length prefixed mode to start code
+prefixed mode (as defined in the Annex B of the ITU-T H.264
+specification).
+</p>
+<p>This is required by some streaming formats, typically the MPEG-2
+transport stream format (muxer <code>mpegts</code>).
+</p>
+<p>For example to remux an MP4 file containing an H.264 stream to mpegts
+format with <code>ffmpeg</code>, you can use the command:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
+</pre></div>
+
+<p>Please note that this filter is auto-inserted for MPEG-TS (muxer
+<code>mpegts</code>) and raw H.264 (muxer <code>h264</code>) output formats.
+</p>
+<a name="h264_005fredundant_005fpps"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-h264_005fredundant_005fpps">2.12 h264_redundant_pps</a></h2>
+
+<p>This applies a specific fixup to some Blu-ray streams which contain
+redundant PPSs modifying irrelevant parameters of the stream which
+confuse other transformations which require correct extradata.
+</p>
+<p>A new single global PPS is created, and all of the redundant PPSs
+within the stream are removed.
+</p>
+<a name="hevc_005fmetadata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-hevc_005fmetadata">2.13 hevc_metadata</a></h2>
+
+<p>Modify metadata embedded in an HEVC stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>aud</samp>&rsquo;</dt>
+<dd><p>Insert or remove AUD NAL units in all access units of the stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>insert</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>remove</samp>&rsquo;</dt>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>sample_aspect_ratio</samp>&rsquo;</dt>
+<dd><p>Set the sample aspect ratio in the stream in the VUI parameters.
+</p>
+</dd>
+<dt>&lsquo;<samp>video_format</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>video_full_range_flag</samp>&rsquo;</dt>
+<dd><p>Set the video format in the stream (see H.265 section E.3.1 and
+table E.2).
+</p>
+</dd>
+<dt>&lsquo;<samp>colour_primaries</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>transfer_characteristics</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>matrix_coefficients</samp>&rsquo;</dt>
+<dd><p>Set the colour description in the stream (see H.265 section E.3.1
+and tables E.3, E.4 and E.5).
+</p>
+</dd>
+<dt>&lsquo;<samp>chroma_sample_loc_type</samp>&rsquo;</dt>
+<dd><p>Set the chroma sample location in the stream (see H.265 section
+E.3.1 and figure E.1).
+</p>
+</dd>
+<dt>&lsquo;<samp>tick_rate</samp>&rsquo;</dt>
+<dd><p>Set the tick rate in the VPS and VUI parameters (num_units_in_tick /
+time_scale).  Combined with &lsquo;<samp>num_ticks_poc_diff_one</samp>&rsquo;, this can
+set a constant framerate in the stream.  Note that it is likely to be
+overridden by container parameters when the stream is in a container.
+</p>
+</dd>
+<dt>&lsquo;<samp>num_ticks_poc_diff_one</samp>&rsquo;</dt>
+<dd><p>Set poc_proportional_to_timing_flag in VPS and VUI and use this value
+to set num_ticks_poc_diff_one_minus1 (see H.265 sections 7.4.3.1 and
+E.3.1).  Ignored if &lsquo;<samp>tick_rate</samp>&rsquo; is not also set.
+</p>
+</dd>
+<dt>&lsquo;<samp>crop_left</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>crop_right</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>crop_top</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>crop_bottom</samp>&rsquo;</dt>
+<dd><p>Set the conformance window cropping offsets in the SPS.  These values
+will replace the current ones if the stream is already cropped.
+</p>
+<p>These fields are set in pixels.  Note that some sizes may not be
+representable if the chroma is subsampled (H.265 section 7.4.3.2.1).
+</p>
+</dd>
+<dt>&lsquo;<samp>level</samp>&rsquo;</dt>
+<dd><p>Set the level in the VPS and SPS.  See H.265 section A.4 and tables
+A.6 and A.7.
+</p>
+<p>The argument must be the name of a level (for example, &lsquo;<samp>5.1</samp>&rsquo;), a
+<em>general_level_idc</em> value (for example, &lsquo;<samp>153</samp>&rsquo; for level 5.1),
+or the special name &lsquo;<samp>auto</samp>&rsquo; indicating that the filter should
+attempt to guess the level from the input stream properties.
+</p>
+</dd>
+</dl>
+
+<a name="hevc_005fmp4toannexb"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-hevc_005fmp4toannexb">2.14 hevc_mp4toannexb</a></h2>
+
+<p>Convert an HEVC/H.265 bitstream from length prefixed mode to start code
+prefixed mode (as defined in the Annex B of the ITU-T H.265
+specification).
+</p>
+<p>This is required by some streaming formats, typically the MPEG-2
+transport stream format (muxer <code>mpegts</code>).
+</p>
+<p>For example to remux an MP4 file containing an HEVC stream to mpegts
+format with <code>ffmpeg</code>, you can use the command:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i INPUT.mp4 -codec copy -bsf:v hevc_mp4toannexb OUTPUT.ts
+</pre></div>
+
+<p>Please note that this filter is auto-inserted for MPEG-TS (muxer
+<code>mpegts</code>) and raw HEVC/H.265 (muxer <code>h265</code> or
+<code>hevc</code>) output formats.
+</p>
+<a name="imxdump"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-imxdump">2.15 imxdump</a></h2>
+
+<p>Modifies the bitstream to fit in MOV and to be usable by the Final Cut
+Pro decoder. This filter only applies to the mpeg2video codec, and is
+likely not needed for Final Cut Pro 7 and newer with the appropriate
+&lsquo;<samp>-tag:v</samp>&rsquo;.
+</p>
+<p>For example, to remux 30 MB/sec NTSC IMX to MOV:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov
+</pre></div>
+
+<a name="mjpeg2jpeg"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-mjpeg2jpeg">2.16 mjpeg2jpeg</a></h2>
+
+<p>Convert MJPEG/AVI1 packets to full JPEG/JFIF packets.
+</p>
+<p>MJPEG is a video codec wherein each video frame is essentially a
+JPEG image. The individual frames can be extracted without loss,
+e.g. by
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg
+</pre></div>
+
+<p>Unfortunately, these chunks are incomplete JPEG images, because
+they lack the DHT segment required for decoding. Quoting from
+<a href="http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml">http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml</a>:
+</p>
+<p>Avery Lee, writing in the rec.video.desktop newsgroup in 2001,
+commented that &quot;MJPEG, or at least the MJPEG in AVIs having the
+MJPG fourcc, is restricted JPEG with a fixed &ndash; and *omitted* &ndash;
+Huffman table. The JPEG must be YCbCr colorspace, it must be 4:2:2,
+and it must use basic Huffman encoding, not arithmetic or
+progressive. . . . You can indeed extract the MJPEG frames and
+decode them with a regular JPEG decoder, but you have to prepend
+the DHT segment to them, or else the decoder won&rsquo;t have any idea
+how to decompress the data. The exact table necessary is given in
+the OpenDML spec.&quot;
+</p>
+<p>This bitstream filter patches the header of frames extracted from an MJPEG
+stream (carrying the AVI1 header ID and lacking a DHT segment) to
+produce fully qualified JPEG images.
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg
+exiftran -i -9 frame*.jpg
+ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
+</pre></div>
+
+<a name="mjpegadump"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-mjpegadump">2.17 mjpegadump</a></h2>
+
+<p>Add an MJPEG A header to the bitstream, to enable decoding by
+Quicktime.
+</p>
+<p><a name="mov2textsub"></a>
+</p><a name="mov2textsub-1"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-mov2textsub-1">2.18 mov2textsub</a></h2>
+
+<p>Extract a representable text file from MOV subtitles, stripping the
+metadata header from each subtitle packet.
+</p>
+<p>See also the <a href="#text2movsub">text2movsub</a> filter.
+</p>
+<a name="mp3decomp"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-mp3decomp">2.19 mp3decomp</a></h2>
+
+<p>Decompress non-standard compressed MP3 audio headers.
+</p>
+<a name="mpeg2_005fmetadata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-mpeg2_005fmetadata">2.20 mpeg2_metadata</a></h2>
+
+<p>Modify metadata embedded in an MPEG-2 stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>display_aspect_ratio</samp>&rsquo;</dt>
+<dd><p>Set the display aspect ratio in the stream.
+</p>
+<p>The following fixed values are supported:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>4/3</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>16/9</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>221/100</samp>&rsquo;</dt>
+</dl>
+<p>Any other value will result in square pixels being signalled instead
+(see H.262 section 6.3.3 and table 6-3).
+</p>
+</dd>
+<dt>&lsquo;<samp>frame_rate</samp>&rsquo;</dt>
+<dd><p>Set the frame rate in the stream.  This is constructed from a table
+of known values combined with a small multiplier and divisor - if
+the supplied value is not exactly representable, the nearest
+representable value will be used instead (see H.262 section 6.3.3
+and table 6-4).
+</p>
+</dd>
+<dt>&lsquo;<samp>video_format</samp>&rsquo;</dt>
+<dd><p>Set the video format in the stream (see H.262 section 6.3.6 and
+table 6-6).
+</p>
+</dd>
+<dt>&lsquo;<samp>colour_primaries</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>transfer_characteristics</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>matrix_coefficients</samp>&rsquo;</dt>
+<dd><p>Set the colour description in the stream (see H.262 section 6.3.6
+and tables 6-7, 6-8 and 6-9).
+</p>
+</dd>
+</dl>
+
+<a name="mpeg4_005funpack_005fbframes"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-mpeg4_005funpack_005fbframes">2.21 mpeg4_unpack_bframes</a></h2>
+
+<p>Unpack DivX-style packed B-frames.
+</p>
+<p>DivX-style packed B-frames are not valid MPEG-4 and were only a
+workaround for the broken Video for Windows subsystem.
+They use more space, can cause minor AV sync issues, require more
+CPU power to decode (unless the player has some decoded picture queue
+to compensate the 2,0,2,0 frame per packet style) and cause
+trouble if copied into a standard container like mp4 or mpeg-ps/ts,
+because MPEG-4 decoders may not be able to decode them, since they are
+not valid MPEG-4.
+</p>
+<p>For example to fix an AVI file containing an MPEG-4 stream with
+DivX-style packed B-frames using <code>ffmpeg</code>, you can use the command:
+</p>
+<div class="example">
+<pre class="example">ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
+</pre></div>
+
+<a name="noise"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-noise">2.22 noise</a></h2>
+
+<p>Damages the contents of packets or simply drops them without damaging the
+container. Can be used for fuzzing or testing error resilience/concealment.
+</p>
+<p>Parameters:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>amount</samp>&rsquo;</dt>
+<dd><p>A numeral string, whose value is related to how often output bytes will
+be modified. Therefore, values below or equal to 0 are forbidden, and
+the lower the more frequent bytes will be modified, with 1 meaning
+every byte is modified.
+</p></dd>
+<dt>&lsquo;<samp>dropamount</samp>&rsquo;</dt>
+<dd><p>A numeral string, whose value is related to how often packets will be dropped.
+Therefore, values below or equal to 0 are forbidden, and the lower the more
+frequent packets will be dropped, with 1 meaning every packet is dropped.
+</p></dd>
+</dl>
+
+<p>The following example applies the modification to every byte but does not drop
+any packets.
+</p><div class="example">
+<pre class="example">ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv
+</pre></div>
+
+<a name="null"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-null">2.23 null</a></h2>
+<p>This bitstream filter passes the packets through unchanged.
+</p>
+<a name="pcm_005frechunk"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-pcm_005frechunk">2.24 pcm_rechunk</a></h2>
+
+<p>Repacketize PCM audio to a fixed number of samples per packet or a fixed packet
+rate per second. This is similar to the <a href="ffmpeg-filters.html#asetnsamples">(ffmpeg-filters)asetnsamples audio filter</a> but works on audio packets instead of audio frames.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>nb_out_samples, n</samp>&rsquo;</dt>
+<dd><p>Set the number of samples per each output audio packet. The number is intended
+as the number of samples <em>per each channel</em>. Default value is 1024.
+</p>
+</dd>
+<dt>&lsquo;<samp>pad, p</samp>&rsquo;</dt>
+<dd><p>If set to 1, the filter will pad the last audio packet with silence, so that it
+will contain the same number of samples (or roughly the same number of samples,
+see &lsquo;<samp>frame_rate</samp>&rsquo;) as the previous ones. Default value is 1.
+</p>
+</dd>
+<dt>&lsquo;<samp>frame_rate, r</samp>&rsquo;</dt>
+<dd><p>This option makes the filter output a fixed number of packets per second instead
+of a fixed number of samples per packet. If the audio sample rate is not
+divisible by the frame rate then the number of samples will not be constant but
+will vary slightly so that each packet will start as close to the frame
+boundary as possible. Using this option has precedence over &lsquo;<samp>nb_out_samples</samp>&rsquo;.
+</p></dd>
+</dl>
+
+<p>You can generate the well known 1602-1601-1602-1601-1602 pattern of 48kHz audio
+for NTSC frame rate using the &lsquo;<samp>frame_rate</samp>&rsquo; option.
+</p><div class="example">
+<pre class="example">ffmpeg -f lavfi -i sine=r=48000:d=1 -c pcm_s16le -bsf pcm_rechunk=r=30000/1001 -f framecrc -
+</pre></div>
+
+<a name="prores_005fmetadata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-prores_005fmetadata">2.25 prores_metadata</a></h2>
+
+<p>Modify color property metadata embedded in prores stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>color_primaries</samp>&rsquo;</dt>
+<dd><p>Set the color primaries.
+Available values are:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>auto</samp>&rsquo;</dt>
+<dd><p>Keep the same color primaries property (default).
+</p>
+</dd>
+<dt>&lsquo;<samp>unknown</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt709</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt470bg</samp>&rsquo;</dt>
+<dd><p>BT601 625
+</p>
+</dd>
+<dt>&lsquo;<samp>smpte170m</samp>&rsquo;</dt>
+<dd><p>BT601 525
+</p>
+</dd>
+<dt>&lsquo;<samp>bt2020</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>smpte431</samp>&rsquo;</dt>
+<dd><p>DCI P3
+</p>
+</dd>
+<dt>&lsquo;<samp>smpte432</samp>&rsquo;</dt>
+<dd><p>P3 D65
+</p>
+</dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>transfer_characteristics</samp>&rsquo;</dt>
+<dd><p>Set the color transfer.
+Available values are:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>auto</samp>&rsquo;</dt>
+<dd><p>Keep the same transfer characteristics property (default).
+</p>
+</dd>
+<dt>&lsquo;<samp>unknown</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt709</samp>&rsquo;</dt>
+<dd><p>BT 601, BT 709, BT 2020
+</p></dd>
+<dt>&lsquo;<samp>smpte2084</samp>&rsquo;</dt>
+<dd><p>SMPTE ST 2084
+</p></dd>
+<dt>&lsquo;<samp>arib-std-b67</samp>&rsquo;</dt>
+<dd><p>ARIB STD-B67
+</p></dd>
+</dl>
+
+
+</dd>
+<dt>&lsquo;<samp>matrix_coefficients</samp>&rsquo;</dt>
+<dd><p>Set the matrix coefficient.
+Available values are:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>auto</samp>&rsquo;</dt>
+<dd><p>Keep the same colorspace property (default).
+</p>
+</dd>
+<dt>&lsquo;<samp>unknown</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt709</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>smpte170m</samp>&rsquo;</dt>
+<dd><p>BT 601
+</p>
+</dd>
+<dt>&lsquo;<samp>bt2020nc</samp>&rsquo;</dt>
+</dl>
+</dd>
+</dl>
+
+<p>Set Rec709 colorspace for each frame of the file
+</p><div class="example">
+<pre class="example">ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709 output.mov
+</pre></div>
+
+<p>Set Hybrid Log-Gamma parameters for each frame of the file
+</p><div class="example">
+<pre class="example">ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt2020:color_trc=arib-std-b67:colorspace=bt2020nc output.mov
+</pre></div>
+
+<a name="remove_005fextra"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-remove_005fextra">2.26 remove_extra</a></h2>
+
+<p>Remove extradata from packets.
+</p>
+<p>It accepts the following parameter:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>freq</samp>&rsquo;</dt>
+<dd><p>Set which frame types to remove extradata from.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>k</samp>&rsquo;</dt>
+<dd><p>Remove extradata from non-keyframes only.
+</p>
+</dd>
+<dt>&lsquo;<samp>keyframe</samp>&rsquo;</dt>
+<dd><p>Remove extradata from keyframes only.
+</p>
+</dd>
+<dt>&lsquo;<samp>e, all</samp>&rsquo;</dt>
+<dd><p>Remove extradata from all frames.
+</p>
+</dd>
+</dl>
+</dd>
+</dl>
+
+<p><a name="text2movsub"></a>
+</p><a name="text2movsub-1"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-text2movsub-1">2.27 text2movsub</a></h2>
+
+<p>Convert text subtitles to MOV subtitles (as used by the <code>mov_text</code>
+codec) with metadata headers.
+</p>
+<p>See also the <a href="#mov2textsub">mov2textsub</a> filter.
+</p>
+<a name="trace_005fheaders"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-trace_005fheaders">2.28 trace_headers</a></h2>
+
+<p>Log trace output containing all syntax elements in the coded stream
+headers (everything above the level of individual coded blocks).
+This can be useful for debugging low-level stream issues.
+</p>
+<p>Supports AV1, H.264, H.265, (M)JPEG, MPEG-2 and VP9, but depending
+on the build only a subset of these may be available.
+</p>
+<a name="truehd_005fcore"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-truehd_005fcore">2.29 truehd_core</a></h2>
+
+<p>Extract the core from a TrueHD stream, dropping ATMOS data.
+</p>
+<a name="vp9_005fmetadata"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-vp9_005fmetadata">2.30 vp9_metadata</a></h2>
+
+<p>Modify metadata embedded in a VP9 stream.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>color_space</samp>&rsquo;</dt>
+<dd><p>Set the color space value in the frame header.  Note that any frame
+set to RGB will be implicitly set to PC range and that RGB is
+incompatible with profiles 0 and 2.
+</p><dl compact="compact">
+<dt>&lsquo;<samp>unknown</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt601</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt709</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>smpte170</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>smpte240</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bt2020</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>rgb</samp>&rsquo;</dt>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>color_range</samp>&rsquo;</dt>
+<dd><p>Set the color range value in the frame header.  Note that any value
+imposed by the color space will take precedence over this value.
+</p><dl compact="compact">
+<dt>&lsquo;<samp>tv</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>pc</samp>&rsquo;</dt>
+</dl>
+</dd>
+</dl>
+
+<a name="vp9_005fsuperframe"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-vp9_005fsuperframe">2.31 vp9_superframe</a></h2>
+
+<p>Merge VP9 invisible (alt-ref) frames back into VP9 superframes. This
+fixes merging of split/segmented VP9 streams where the alt-ref frame
+was split from its visible counterpart.
+</p>
+<a name="vp9_005fsuperframe_005fsplit"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-vp9_005fsuperframe_005fsplit">2.32 vp9_superframe_split</a></h2>
+
+<p>Split VP9 superframes into single frames.
+</p>
+<a name="vp9_005fraw_005freorder"></a>
+<h2 class="section"><a href="ffmpeg-bitstream-filters.html#toc-vp9_005fraw_005freorder">2.33 vp9_raw_reorder</a></h2>
+
+<p>Given a VP9 stream with correct timestamps but possibly out of order,
+insert additional show-existing-frame packets to correct the ordering.
+</p>
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="ffmpeg-bitstream-filters.html#toc-See-Also">3 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="libavcodec.html">libavcodec</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="ffmpeg-bitstream-filters.html#toc-Authors">4 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

File diff suppressed because it is too large
+ 6118 - 0
ffmpeg/doc/ffmpeg-codecs.html


File diff suppressed because it is too large
+ 2461 - 0
ffmpeg/doc/ffmpeg-devices.html


File diff suppressed because it is too large
+ 30840 - 0
ffmpeg/doc/ffmpeg-filters.html


File diff suppressed because it is too large
+ 4428 - 0
ffmpeg/doc/ffmpeg-formats.html


File diff suppressed because it is too large
+ 2225 - 0
ffmpeg/doc/ffmpeg-protocols.html


+ 372 - 0
ffmpeg/doc/ffmpeg-resampler.html

@@ -0,0 +1,372 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="FFmpeg Resampler Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : FFmpeg Resampler ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">FFmpeg Resampler Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-Resampler-Options" href="#Resampler-Options">2 Resampler Options</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">3 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">4 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="ffmpeg-resampler.html#toc-Description">1 Description</a></h1>
+
+<p>The FFmpeg resampler provides a high-level interface to the
+libswresample library audio resampling utilities. In particular it
+allows one to perform audio resampling, audio channel layout rematrixing,
+and convert audio format and packing layout.
+</p>
+
+<a name="Resampler-Options"></a>
+<h1 class="chapter"><a href="ffmpeg-resampler.html#toc-Resampler-Options">2 Resampler Options</a></h1>
+
+<p>The audio resampler supports the following named options.
+</p>
+<p>Options may be set by specifying -<var>option</var> <var>value</var> in the
+FFmpeg tools, <var>option</var>=<var>value</var> for the aresample filter,
+by setting the value explicitly in the
+<code>SwrContext</code> options or using the &lsquo;<tt>libavutil/opt.h</tt>&rsquo; API for
+programmatic use.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>ich, in_channel_count</samp>&rsquo;</dt>
+<dd><p>Set the number of input channels. Default value is 0. Setting this
+value is not mandatory if the corresponding channel layout
+&lsquo;<samp>in_channel_layout</samp>&rsquo; is set.
+</p>
+</dd>
+<dt>&lsquo;<samp>och, out_channel_count</samp>&rsquo;</dt>
+<dd><p>Set the number of output channels. Default value is 0. Setting this
+value is not mandatory if the corresponding channel layout
+&lsquo;<samp>out_channel_layout</samp>&rsquo; is set.
+</p>
+</dd>
+<dt>&lsquo;<samp>uch, used_channel_count</samp>&rsquo;</dt>
+<dd><p>Set the number of used input channels. Default value is 0. This option is
+only used for special remapping.
+</p>
+</dd>
+<dt>&lsquo;<samp>isr, in_sample_rate</samp>&rsquo;</dt>
+<dd><p>Set the input sample rate. Default value is 0.
+</p>
+</dd>
+<dt>&lsquo;<samp>osr, out_sample_rate</samp>&rsquo;</dt>
+<dd><p>Set the output sample rate. Default value is 0.
+</p>
+</dd>
+<dt>&lsquo;<samp>isf, in_sample_fmt</samp>&rsquo;</dt>
+<dd><p>Specify the input sample format. It is set by default to <code>none</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>osf, out_sample_fmt</samp>&rsquo;</dt>
+<dd><p>Specify the output sample format. It is set by default to <code>none</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>tsf, internal_sample_fmt</samp>&rsquo;</dt>
+<dd><p>Set the internal sample format. Default value is <code>none</code>.
+This will automatically be chosen when it is not explicitly set.
+</p>
+</dd>
+<dt>&lsquo;<samp>icl, in_channel_layout</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>ocl, out_channel_layout</samp>&rsquo;</dt>
+<dd><p>Set the input/output channel layout.
+</p>
+<p>See <a href="ffmpeg-utils.html#channel-layout-syntax">(ffmpeg-utils)the Channel Layout section in the ffmpeg-utils(1) manual</a>
+for the required syntax.
+</p>
+</dd>
+<dt>&lsquo;<samp>clev, center_mix_level</samp>&rsquo;</dt>
+<dd><p>Set the center mix level. It is a value expressed in deciBel, and must be
+in the interval [-32,32].
+</p>
+</dd>
+<dt>&lsquo;<samp>slev, surround_mix_level</samp>&rsquo;</dt>
+<dd><p>Set the surround mix level. It is a value expressed in deciBel, and must
+be in the interval [-32,32].
+</p>
+</dd>
+<dt>&lsquo;<samp>lfe_mix_level</samp>&rsquo;</dt>
+<dd><p>Set LFE mix into non LFE level. It is used when there is a LFE input but no
+LFE output. It is a value expressed in deciBel, and must
+be in the interval [-32,32].
+</p>
+</dd>
+<dt>&lsquo;<samp>rmvol, rematrix_volume</samp>&rsquo;</dt>
+<dd><p>Set rematrix volume. Default value is 1.0.
+</p>
+</dd>
+<dt>&lsquo;<samp>rematrix_maxval</samp>&rsquo;</dt>
+<dd><p>Set maximum output value for rematrixing.
+This can be used to prevent clipping vs. preventing volume reduction.
+A value of 1.0 prevents clipping.
+</p>
+</dd>
+<dt>&lsquo;<samp>flags, swr_flags</samp>&rsquo;</dt>
+<dd><p>Set flags used by the converter. Default value is 0.
+</p>
+<p>It supports the following individual flags:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>res</samp>&rsquo;</dt>
+<dd><p>force resampling, this flag forces resampling to be used even when the
+input and output sample rates match.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>dither_scale</samp>&rsquo;</dt>
+<dd><p>Set the dither scale. Default value is 1.
+</p>
+</dd>
+<dt>&lsquo;<samp>dither_method</samp>&rsquo;</dt>
+<dd><p>Set dither method. Default value is 0.
+</p>
+<p>Supported values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>rectangular</samp>&rsquo;</dt>
+<dd><p>select rectangular dither
+</p></dd>
+<dt>&lsquo;<samp>triangular</samp>&rsquo;</dt>
+<dd><p>select triangular dither
+</p></dd>
+<dt>&lsquo;<samp>triangular_hp</samp>&rsquo;</dt>
+<dd><p>select triangular dither with high pass
+</p></dd>
+<dt>&lsquo;<samp>lipshitz</samp>&rsquo;</dt>
+<dd><p>select Lipshitz noise shaping dither.
+</p></dd>
+<dt>&lsquo;<samp>shibata</samp>&rsquo;</dt>
+<dd><p>select Shibata noise shaping dither.
+</p></dd>
+<dt>&lsquo;<samp>low_shibata</samp>&rsquo;</dt>
+<dd><p>select low Shibata noise shaping dither.
+</p></dd>
+<dt>&lsquo;<samp>high_shibata</samp>&rsquo;</dt>
+<dd><p>select high Shibata noise shaping dither.
+</p></dd>
+<dt>&lsquo;<samp>f_weighted</samp>&rsquo;</dt>
+<dd><p>select f-weighted noise shaping dither
+</p></dd>
+<dt>&lsquo;<samp>modified_e_weighted</samp>&rsquo;</dt>
+<dd><p>select modified-e-weighted noise shaping dither
+</p></dd>
+<dt>&lsquo;<samp>improved_e_weighted</samp>&rsquo;</dt>
+<dd><p>select improved-e-weighted noise shaping dither
+</p>
+</dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>resampler</samp>&rsquo;</dt>
+<dd><p>Set resampling engine. Default value is swr.
+</p>
+<p>Supported values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>swr</samp>&rsquo;</dt>
+<dd><p>select the native SW Resampler; filter options precision and cheby are not
+applicable in this case.
+</p></dd>
+<dt>&lsquo;<samp>soxr</samp>&rsquo;</dt>
+<dd><p>select the SoX Resampler (where available); compensation, and filter options
+filter_size, phase_shift, exact_rational, filter_type &amp; kaiser_beta, are not
+applicable in this case.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>filter_size</samp>&rsquo;</dt>
+<dd><p>For swr only, set resampling filter size, default value is 32.
+</p>
+</dd>
+<dt>&lsquo;<samp>phase_shift</samp>&rsquo;</dt>
+<dd><p>For swr only, set resampling phase shift, default value is 10, and must be in
+the interval [0,30].
+</p>
+</dd>
+<dt>&lsquo;<samp>linear_interp</samp>&rsquo;</dt>
+<dd><p>Use linear interpolation when enabled (the default). Disable it if you want
+to preserve speed instead of quality when exact_rational fails.
+</p>
+</dd>
+<dt>&lsquo;<samp>exact_rational</samp>&rsquo;</dt>
+<dd><p>For swr only, when enabled, try to use exact phase_count based on input and
+output sample rate. However, if it is larger than <code>1 &lt;&lt; phase_shift</code>,
+the phase_count will be <code>1 &lt;&lt; phase_shift</code> as fallback. Default is enabled.
+</p>
+</dd>
+<dt>&lsquo;<samp>cutoff</samp>&rsquo;</dt>
+<dd><p>Set cutoff frequency (swr: 6dB point; soxr: 0dB point) ratio; must be a float
+value between 0 and 1.  Default value is 0.97 with swr, and 0.91 with soxr
+(which, with a sample-rate of 44100, preserves the entire audio band to 20kHz).
+</p>
+</dd>
+<dt>&lsquo;<samp>precision</samp>&rsquo;</dt>
+<dd><p>For soxr only, the precision in bits to which the resampled signal will be
+calculated.  The default value of 20 (which, with suitable dithering, is
+appropriate for a destination bit-depth of 16) gives SoX&rsquo;s &rsquo;High Quality&rsquo;; a
+value of 28 gives SoX&rsquo;s &rsquo;Very High Quality&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>cheby</samp>&rsquo;</dt>
+<dd><p>For soxr only, selects passband rolloff none (Chebyshev) &amp; higher-precision
+approximation for &rsquo;irrational&rsquo; ratios. Default value is 0.
+</p>
+</dd>
+<dt>&lsquo;<samp>async</samp>&rsquo;</dt>
+<dd><p>For swr only, simple 1 parameter audio sync to timestamps using stretching,
+squeezing, filling and trimming. Setting this to 1 will enable filling and
+trimming, larger values represent the maximum amount in samples that the data
+may be stretched or squeezed for each second.
+Default value is 0, thus no compensation is applied to make the samples match
+the audio timestamps.
+</p>
+</dd>
+<dt>&lsquo;<samp>first_pts</samp>&rsquo;</dt>
+<dd><p>For swr only, assume the first pts should be this value. The time unit is 1 / sample rate.
+This allows for padding/trimming at the start of stream. By default, no
+assumption is made about the first frame&rsquo;s expected pts, so no padding or
+trimming is done. For example, this could be set to 0 to pad the beginning with
+silence if an audio stream starts after the video stream or to trim any samples
+with a negative pts due to encoder delay.
+</p>
+</dd>
+<dt>&lsquo;<samp>min_comp</samp>&rsquo;</dt>
+<dd><p>For swr only, set the minimum difference between timestamps and audio data (in
+seconds) to trigger stretching/squeezing/filling or trimming of the
+data to make it match the timestamps. The default is that
+stretching/squeezing/filling and trimming is disabled
+(&lsquo;<samp>min_comp</samp>&rsquo; = <code>FLT_MAX</code>).
+</p>
+</dd>
+<dt>&lsquo;<samp>min_hard_comp</samp>&rsquo;</dt>
+<dd><p>For swr only, set the minimum difference between timestamps and audio data (in
+seconds) to trigger adding/dropping samples to make it match the
+timestamps.  This option effectively is a threshold to select between
+hard (trim/fill) and soft (squeeze/stretch) compensation. Note that
+all compensation is by default disabled through &lsquo;<samp>min_comp</samp>&rsquo;.
+The default is 0.1.
+</p>
+</dd>
+<dt>&lsquo;<samp>comp_duration</samp>&rsquo;</dt>
+<dd><p>For swr only, set duration (in seconds) over which data is stretched/squeezed
+to make it match the timestamps. Must be a non-negative double float value,
+default value is 1.0.
+</p>
+</dd>
+<dt>&lsquo;<samp>max_soft_comp</samp>&rsquo;</dt>
+<dd><p>For swr only, set maximum factor by which data is stretched/squeezed to make it
+match the timestamps. Must be a non-negative double float value, default value
+is 0.
+</p>
+</dd>
+<dt>&lsquo;<samp>matrix_encoding</samp>&rsquo;</dt>
+<dd><p>Select matrixed stereo encoding.
+</p>
+<p>It accepts the following values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>none</samp>&rsquo;</dt>
+<dd><p>select none
+</p></dd>
+<dt>&lsquo;<samp>dolby</samp>&rsquo;</dt>
+<dd><p>select Dolby
+</p></dd>
+<dt>&lsquo;<samp>dplii</samp>&rsquo;</dt>
+<dd><p>select Dolby Pro Logic II
+</p></dd>
+</dl>
+
+<p>Default value is <code>none</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>filter_type</samp>&rsquo;</dt>
+<dd><p>For swr only, select resampling filter type. This only affects resampling
+operations.
+</p>
+<p>It accepts the following values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>cubic</samp>&rsquo;</dt>
+<dd><p>select cubic
+</p></dd>
+<dt>&lsquo;<samp>blackman_nuttall</samp>&rsquo;</dt>
+<dd><p>select Blackman Nuttall windowed sinc
+</p></dd>
+<dt>&lsquo;<samp>kaiser</samp>&rsquo;</dt>
+<dd><p>select Kaiser windowed sinc
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>kaiser_beta</samp>&rsquo;</dt>
+<dd><p>For swr only, set Kaiser window beta value. Must be a double float value in the
+interval [2,16], default value is 9.
+</p>
+</dd>
+<dt>&lsquo;<samp>output_sample_bits</samp>&rsquo;</dt>
+<dd><p>For swr only, set number of used output sample bits for dithering. Must be an integer in the
+interval [0,64], default value is 0, which means it&rsquo;s not used.
+</p>
+</dd>
+</dl>
+
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="ffmpeg-resampler.html#toc-See-Also">3 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="libswresample.html">libswresample</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="ffmpeg-resampler.html#toc-Authors">4 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 267 - 0
ffmpeg/doc/ffmpeg-scaler.html

@@ -0,0 +1,267 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="FFmpeg Scaler Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : FFmpeg Scaler ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">FFmpeg Scaler Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-Scaler-Options" href="#Scaler-Options">2 Scaler Options</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">3 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">4 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="ffmpeg-scaler.html#toc-Description">1 Description</a></h1>
+
+<p>The FFmpeg rescaler provides a high-level interface to the libswscale
+library image conversion utilities. In particular it allows one to perform
+image rescaling and pixel format conversion.
+</p>
+
+<p><a name="scaler_005foptions"></a>
+</p><a name="Scaler-Options"></a>
+<h1 class="chapter"><a href="ffmpeg-scaler.html#toc-Scaler-Options">2 Scaler Options</a></h1>
+
+<p>The video scaler supports the following named options.
+</p>
+<p>Options may be set by specifying -<var>option</var> <var>value</var> in the
+FFmpeg tools, with a few API-only exceptions noted below.
+For programmatic use, they can be set explicitly in the
+<code>SwsContext</code> options or through the &lsquo;<tt>libavutil/opt.h</tt>&rsquo; API.
+</p>
+<dl compact="compact">
+<dd>
+<p><a name="sws_005fflags"></a>
+</p></dd>
+<dt>&lsquo;<samp>sws_flags</samp>&rsquo;</dt>
+<dd><p>Set the scaler flags. This is also used to set the scaling
+algorithm. Only a single algorithm should be selected. Default
+value is &lsquo;<samp>bicubic</samp>&rsquo;.
+</p>
+<p>It accepts the following values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>fast_bilinear</samp>&rsquo;</dt>
+<dd><p>Select fast bilinear scaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>bilinear</samp>&rsquo;</dt>
+<dd><p>Select bilinear scaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>bicubic</samp>&rsquo;</dt>
+<dd><p>Select bicubic scaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>experimental</samp>&rsquo;</dt>
+<dd><p>Select experimental scaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>neighbor</samp>&rsquo;</dt>
+<dd><p>Select nearest neighbor rescaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>area</samp>&rsquo;</dt>
+<dd><p>Select averaging area rescaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>bicublin</samp>&rsquo;</dt>
+<dd><p>Select bicubic scaling algorithm for the luma component, bilinear for
+chroma components.
+</p>
+</dd>
+<dt>&lsquo;<samp>gauss</samp>&rsquo;</dt>
+<dd><p>Select Gaussian rescaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>sinc</samp>&rsquo;</dt>
+<dd><p>Select sinc rescaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>lanczos</samp>&rsquo;</dt>
+<dd><p>Select Lanczos rescaling algorithm. The default width (alpha) is 3 and can be
+changed by setting <code>param0</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>spline</samp>&rsquo;</dt>
+<dd><p>Select natural bicubic spline rescaling algorithm.
+</p>
+</dd>
+<dt>&lsquo;<samp>print_info</samp>&rsquo;</dt>
+<dd><p>Enable printing/debug logging.
+</p>
+</dd>
+<dt>&lsquo;<samp>accurate_rnd</samp>&rsquo;</dt>
+<dd><p>Enable accurate rounding.
+</p>
+</dd>
+<dt>&lsquo;<samp>full_chroma_int</samp>&rsquo;</dt>
+<dd><p>Enable full chroma interpolation.
+</p>
+</dd>
+<dt>&lsquo;<samp>full_chroma_inp</samp>&rsquo;</dt>
+<dd><p>Select full chroma input.
+</p>
+</dd>
+<dt>&lsquo;<samp>bitexact</samp>&rsquo;</dt>
+<dd><p>Enable bitexact output.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>srcw <var>(API only)</var></samp>&rsquo;</dt>
+<dd><p>Set source width.
+</p>
+</dd>
+<dt>&lsquo;<samp>srch <var>(API only)</var></samp>&rsquo;</dt>
+<dd><p>Set source height.
+</p>
+</dd>
+<dt>&lsquo;<samp>dstw <var>(API only)</var></samp>&rsquo;</dt>
+<dd><p>Set destination width.
+</p>
+</dd>
+<dt>&lsquo;<samp>dsth <var>(API only)</var></samp>&rsquo;</dt>
+<dd><p>Set destination height.
+</p>
+</dd>
+<dt>&lsquo;<samp>src_format <var>(API only)</var></samp>&rsquo;</dt>
+<dd><p>Set source pixel format (must be expressed as an integer).
+</p>
+</dd>
+<dt>&lsquo;<samp>dst_format <var>(API only)</var></samp>&rsquo;</dt>
+<dd><p>Set destination pixel format (must be expressed as an integer).
+</p>
+</dd>
+<dt>&lsquo;<samp>src_range <var>(boolean)</var></samp>&rsquo;</dt>
+<dd><p>If value is set to <code>1</code>, indicates source is full range. Default value is
+<code>0</code>, which indicates source is limited range.
+</p>
+</dd>
+<dt>&lsquo;<samp>dst_range <var>(boolean)</var></samp>&rsquo;</dt>
+<dd><p>If value is set to <code>1</code>, enable full range for destination. Default value
+is <code>0</code>, which enables limited range.
+</p>
+<p><a name="sws_005fparams"></a>
+</p></dd>
+<dt>&lsquo;<samp>param0, param1</samp>&rsquo;</dt>
+<dd><p>Set scaling algorithm parameters. The specified values are specific of
+some scaling algorithms and ignored by others. The specified values
+are floating point number values.
+</p>
+</dd>
+<dt>&lsquo;<samp>sws_dither</samp>&rsquo;</dt>
+<dd><p>Set the dithering algorithm. Accepts one of the following
+values. Default value is &lsquo;<samp>auto</samp>&rsquo;.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>auto</samp>&rsquo;</dt>
+<dd><p>automatic choice
+</p>
+</dd>
+<dt>&lsquo;<samp>none</samp>&rsquo;</dt>
+<dd><p>no dithering
+</p>
+</dd>
+<dt>&lsquo;<samp>bayer</samp>&rsquo;</dt>
+<dd><p>bayer dither
+</p>
+</dd>
+<dt>&lsquo;<samp>ed</samp>&rsquo;</dt>
+<dd><p>error diffusion dither
+</p>
+</dd>
+<dt>&lsquo;<samp>a_dither</samp>&rsquo;</dt>
+<dd><p>arithmetic dither, based using addition
+</p>
+</dd>
+<dt>&lsquo;<samp>x_dither</samp>&rsquo;</dt>
+<dd><p>arithmetic dither, based using xor (more random/less apparent patterning that
+a_dither).
+</p>
+</dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>alphablend</samp>&rsquo;</dt>
+<dd><p>Set the alpha blending to use when the input has alpha but the output does not.
+Default value is &lsquo;<samp>none</samp>&rsquo;.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>uniform_color</samp>&rsquo;</dt>
+<dd><p>Blend onto a uniform background color
+</p>
+</dd>
+<dt>&lsquo;<samp>checkerboard</samp>&rsquo;</dt>
+<dd><p>Blend onto a checkerboard
+</p>
+</dd>
+<dt>&lsquo;<samp>none</samp>&rsquo;</dt>
+<dd><p>No blending
+</p>
+</dd>
+</dl>
+
+</dd>
+</dl>
+
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="ffmpeg-scaler.html#toc-See-Also">3 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="libswscale.html">libswscale</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="ffmpeg-scaler.html#toc-Authors">4 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

File diff suppressed because it is too large
+ 1512 - 0
ffmpeg/doc/ffmpeg-utils.html


File diff suppressed because it is too large
+ 2752 - 0
ffmpeg/doc/ffmpeg.html


File diff suppressed because it is too large
+ 41782 - 0
ffmpeg/doc/ffplay-all.html


+ 860 - 0
ffmpeg/doc/ffplay.html

@@ -0,0 +1,860 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="ffplay Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : ffplay ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">ffplay Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Synopsis" href="#Synopsis">1 Synopsis</a></li>
+  <li><a name="toc-Description" href="#Description">2 Description</a></li>
+  <li><a name="toc-Options" href="#Options">3 Options</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Stream-specifiers-1" href="#Stream-specifiers-1">3.1 Stream specifiers</a></li>
+    <li><a name="toc-Generic-options" href="#Generic-options">3.2 Generic options</a></li>
+    <li><a name="toc-AVOptions" href="#AVOptions">3.3 AVOptions</a></li>
+    <li><a name="toc-Main-options" href="#Main-options">3.4 Main options</a></li>
+    <li><a name="toc-Advanced-options" href="#Advanced-options">3.5 Advanced options</a></li>
+    <li><a name="toc-While-playing" href="#While-playing">3.6 While playing</a></li>
+  </ul></li>
+  <li><a name="toc-See-Also" href="#See-Also">4 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">5 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Synopsis"></a>
+<h1 class="chapter"><a href="ffplay.html#toc-Synopsis">1 Synopsis</a></h1>
+
+<p>ffplay [<var>options</var>] [&lsquo;<tt>input_url</tt>&rsquo;]
+</p>
+<a name="Description"></a>
+<h1 class="chapter"><a href="ffplay.html#toc-Description">2 Description</a></h1>
+
+<p>FFplay is a very simple and portable media player using the FFmpeg
+libraries and the SDL library. It is mostly used as a testbed for the
+various FFmpeg APIs.
+</p>
+<a name="Options"></a>
+<h1 class="chapter"><a href="ffplay.html#toc-Options">3 Options</a></h1>
+
+<p>All the numerical options, if not specified otherwise, accept a string
+representing a number as input, which may be followed by one of the SI
+unit prefixes, for example: &rsquo;K&rsquo;, &rsquo;M&rsquo;, or &rsquo;G&rsquo;.
+</p>
+<p>If &rsquo;i&rsquo; is appended to the SI unit prefix, the complete prefix will be
+interpreted as a unit prefix for binary multiples, which are based on
+powers of 1024 instead of powers of 1000. Appending &rsquo;B&rsquo; to the SI unit
+prefix multiplies the value by 8. This allows using, for example:
+&rsquo;KB&rsquo;, &rsquo;MiB&rsquo;, &rsquo;G&rsquo; and &rsquo;B&rsquo; as number suffixes.
+</p>
+<p>Options which do not take arguments are boolean options, and set the
+corresponding value to true. They can be set to false by prefixing
+the option name with &quot;no&quot;. For example using &quot;-nofoo&quot;
+will set the boolean option with name &quot;foo&quot; to false.
+</p>
+<p><a name="Stream-specifiers"></a>
+</p><a name="Stream-specifiers-1"></a>
+<h2 class="section"><a href="ffplay.html#toc-Stream-specifiers-1">3.1 Stream specifiers</a></h2>
+<p>Some options are applied per-stream, e.g. bitrate or codec. Stream specifiers
+are used to precisely specify which stream(s) a given option belongs to.
+</p>
+<p>A stream specifier is a string generally appended to the option name and
+separated from it by a colon. E.g. <code>-codec:a:1 ac3</code> contains the
+<code>a:1</code> stream specifier, which matches the second audio stream. Therefore, it
+would select the ac3 codec for the second audio stream.
+</p>
+<p>A stream specifier can match several streams, so that the option is applied to all
+of them. E.g. the stream specifier in <code>-b:a 128k</code> matches all audio
+streams.
+</p>
+<p>An empty stream specifier matches all streams. For example, <code>-codec copy</code>
+or <code>-codec: copy</code> would copy all the streams without reencoding.
+</p>
+<p>Possible forms of stream specifiers are:
+</p><dl compact="compact">
+<dt>&lsquo;<samp><var>stream_index</var></samp>&rsquo;</dt>
+<dd><p>Matches the stream with this index. E.g. <code>-threads:1 4</code> would set the
+thread count for the second stream to 4. If <var>stream_index</var> is used as an
+additional stream specifier (see below), then it selects stream number
+<var>stream_index</var> from the matching streams. Stream numbering is based on the
+order of the streams as detected by libavformat except when a program ID is
+also specified. In this case it is based on the ordering of the streams in the
+program.
+</p></dd>
+<dt>&lsquo;<samp><var>stream_type</var>[:<var>additional_stream_specifier</var>]</samp>&rsquo;</dt>
+<dd><p><var>stream_type</var> is one of following: &rsquo;v&rsquo; or &rsquo;V&rsquo; for video, &rsquo;a&rsquo; for audio, &rsquo;s&rsquo;
+for subtitle, &rsquo;d&rsquo; for data, and &rsquo;t&rsquo; for attachments. &rsquo;v&rsquo; matches all video
+streams, &rsquo;V&rsquo; only matches video streams which are not attached pictures, video
+thumbnails or cover arts. If <var>additional_stream_specifier</var> is used, then
+it matches streams which both have this type and match the
+<var>additional_stream_specifier</var>. Otherwise, it matches all streams of the
+specified type.
+</p></dd>
+<dt>&lsquo;<samp>p:<var>program_id</var>[:<var>additional_stream_specifier</var>]</samp>&rsquo;</dt>
+<dd><p>Matches streams which are in the program with the id <var>program_id</var>. If
+<var>additional_stream_specifier</var> is used, then it matches streams which both
+are part of the program and match the <var>additional_stream_specifier</var>.
+</p>
+</dd>
+<dt>&lsquo;<samp>#<var>stream_id</var> or i:<var>stream_id</var></samp>&rsquo;</dt>
+<dd><p>Match the stream by stream id (e.g. PID in MPEG-TS container).
+</p></dd>
+<dt>&lsquo;<samp>m:<var>key</var>[:<var>value</var>]</samp>&rsquo;</dt>
+<dd><p>Matches streams with the metadata tag <var>key</var> having the specified value. If
+<var>value</var> is not given, matches streams that contain the given tag with any
+value.
+</p></dd>
+<dt>&lsquo;<samp>u</samp>&rsquo;</dt>
+<dd><p>Matches streams with usable configuration, the codec must be defined and the
+essential information such as video dimension or audio sample rate must be present.
+</p>
+<p>Note that in <code>ffmpeg</code>, matching by metadata will only work properly for
+input files.
+</p></dd>
+</dl>
+
+<a name="Generic-options"></a>
+<h2 class="section"><a href="ffplay.html#toc-Generic-options">3.2 Generic options</a></h2>
+
+<p>These options are shared amongst the ff* tools.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>-L</samp>&rsquo;</dt>
+<dd><p>Show license.
+</p>
+</dd>
+<dt>&lsquo;<samp>-h, -?, -help, --help [<var>arg</var>]</samp>&rsquo;</dt>
+<dd><p>Show help. An optional parameter may be specified to print help about a specific
+item. If no argument is specified, only basic (non advanced) tool
+options are shown.
+</p>
+<p>Possible values of <var>arg</var> are:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>long</samp>&rsquo;</dt>
+<dd><p>Print advanced tool options in addition to the basic tool options.
+</p>
+</dd>
+<dt>&lsquo;<samp>full</samp>&rsquo;</dt>
+<dd><p>Print complete list of options, including shared and private options
+for encoders, decoders, demuxers, muxers, filters, etc.
+</p>
+</dd>
+<dt>&lsquo;<samp>decoder=<var>decoder_name</var></samp>&rsquo;</dt>
+<dd><p>Print detailed information about the decoder named <var>decoder_name</var>. Use the
+&lsquo;<samp>-decoders</samp>&rsquo; option to get a list of all decoders.
+</p>
+</dd>
+<dt>&lsquo;<samp>encoder=<var>encoder_name</var></samp>&rsquo;</dt>
+<dd><p>Print detailed information about the encoder named <var>encoder_name</var>. Use the
+&lsquo;<samp>-encoders</samp>&rsquo; option to get a list of all encoders.
+</p>
+</dd>
+<dt>&lsquo;<samp>demuxer=<var>demuxer_name</var></samp>&rsquo;</dt>
+<dd><p>Print detailed information about the demuxer named <var>demuxer_name</var>. Use the
+&lsquo;<samp>-formats</samp>&rsquo; option to get a list of all demuxers and muxers.
+</p>
+</dd>
+<dt>&lsquo;<samp>muxer=<var>muxer_name</var></samp>&rsquo;</dt>
+<dd><p>Print detailed information about the muxer named <var>muxer_name</var>. Use the
+&lsquo;<samp>-formats</samp>&rsquo; option to get a list of all muxers and demuxers.
+</p>
+</dd>
+<dt>&lsquo;<samp>filter=<var>filter_name</var></samp>&rsquo;</dt>
+<dd><p>Print detailed information about the filter name <var>filter_name</var>. Use the
+&lsquo;<samp>-filters</samp>&rsquo; option to get a list of all filters.
+</p>
+</dd>
+<dt>&lsquo;<samp>bsf=<var>bitstream_filter_name</var></samp>&rsquo;</dt>
+<dd><p>Print detailed information about the bitstream filter name <var>bitstream_filter_name</var>.
+Use the &lsquo;<samp>-bsfs</samp>&rsquo; option to get a list of all bitstream filters.
+</p></dd>
+</dl>
+
+</dd>
+<dt>&lsquo;<samp>-version</samp>&rsquo;</dt>
+<dd><p>Show version.
+</p>
+</dd>
+<dt>&lsquo;<samp>-formats</samp>&rsquo;</dt>
+<dd><p>Show available formats (including devices).
+</p>
+</dd>
+<dt>&lsquo;<samp>-demuxers</samp>&rsquo;</dt>
+<dd><p>Show available demuxers.
+</p>
+</dd>
+<dt>&lsquo;<samp>-muxers</samp>&rsquo;</dt>
+<dd><p>Show available muxers.
+</p>
+</dd>
+<dt>&lsquo;<samp>-devices</samp>&rsquo;</dt>
+<dd><p>Show available devices.
+</p>
+</dd>
+<dt>&lsquo;<samp>-codecs</samp>&rsquo;</dt>
+<dd><p>Show all codecs known to libavcodec.
+</p>
+<p>Note that the term &rsquo;codec&rsquo; is used throughout this documentation as a shortcut
+for what is more correctly called a media bitstream format.
+</p>
+</dd>
+<dt>&lsquo;<samp>-decoders</samp>&rsquo;</dt>
+<dd><p>Show available decoders.
+</p>
+</dd>
+<dt>&lsquo;<samp>-encoders</samp>&rsquo;</dt>
+<dd><p>Show all available encoders.
+</p>
+</dd>
+<dt>&lsquo;<samp>-bsfs</samp>&rsquo;</dt>
+<dd><p>Show available bitstream filters.
+</p>
+</dd>
+<dt>&lsquo;<samp>-protocols</samp>&rsquo;</dt>
+<dd><p>Show available protocols.
+</p>
+</dd>
+<dt>&lsquo;<samp>-filters</samp>&rsquo;</dt>
+<dd><p>Show available libavfilter filters.
+</p>
+</dd>
+<dt>&lsquo;<samp>-pix_fmts</samp>&rsquo;</dt>
+<dd><p>Show available pixel formats.
+</p>
+</dd>
+<dt>&lsquo;<samp>-sample_fmts</samp>&rsquo;</dt>
+<dd><p>Show available sample formats.
+</p>
+</dd>
+<dt>&lsquo;<samp>-layouts</samp>&rsquo;</dt>
+<dd><p>Show channel names and standard channel layouts.
+</p>
+</dd>
+<dt>&lsquo;<samp>-colors</samp>&rsquo;</dt>
+<dd><p>Show recognized color names.
+</p>
+</dd>
+<dt>&lsquo;<samp>-sources <var>device</var>[,<var>opt1</var>=<var>val1</var>[,<var>opt2</var>=<var>val2</var>]...]</samp>&rsquo;</dt>
+<dd><p>Show autodetected sources of the input device.
+Some devices may provide system-dependent source names that cannot be autodetected.
+The returned list cannot be assumed to be always complete.
+</p><div class="example">
+<pre class="example">ffmpeg -sources pulse,server=192.168.0.4
+</pre></div>
+
+</dd>
+<dt>&lsquo;<samp>-sinks <var>device</var>[,<var>opt1</var>=<var>val1</var>[,<var>opt2</var>=<var>val2</var>]...]</samp>&rsquo;</dt>
+<dd><p>Show autodetected sinks of the output device.
+Some devices may provide system-dependent sink names that cannot be autodetected.
+The returned list cannot be assumed to be always complete.
+</p><div class="example">
+<pre class="example">ffmpeg -sinks pulse,server=192.168.0.4
+</pre></div>
+
+</dd>
+<dt>&lsquo;<samp>-loglevel [<var>flags</var>+]<var>loglevel</var> | -v [<var>flags</var>+]<var>loglevel</var></samp>&rsquo;</dt>
+<dd><p>Set logging level and flags used by the library.
+</p>
+<p>The optional <var>flags</var> prefix can consist of the following values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>repeat</samp>&rsquo;</dt>
+<dd><p>Indicates that repeated log output should not be compressed to the first line
+and the &quot;Last message repeated n times&quot; line will be omitted.
+</p></dd>
+<dt>&lsquo;<samp>level</samp>&rsquo;</dt>
+<dd><p>Indicates that log output should add a <code>[level]</code> prefix to each message
+line. This can be used as an alternative to log coloring, e.g. when dumping the
+log to file.
+</p></dd>
+</dl>
+<p>Flags can also be used alone by adding a &rsquo;+&rsquo;/&rsquo;-&rsquo; prefix to set/reset a single
+flag without affecting other <var>flags</var> or changing <var>loglevel</var>. When
+setting both <var>flags</var> and <var>loglevel</var>, a &rsquo;+&rsquo; separator is expected
+between the last <var>flags</var> value and before <var>loglevel</var>.
+</p>
+<p><var>loglevel</var> is a string or a number containing one of the following values:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>quiet, -8</samp>&rsquo;</dt>
+<dd><p>Show nothing at all; be silent.
+</p></dd>
+<dt>&lsquo;<samp>panic, 0</samp>&rsquo;</dt>
+<dd><p>Only show fatal errors which could lead the process to crash, such as
+an assertion failure. This is not currently used for anything.
+</p></dd>
+<dt>&lsquo;<samp>fatal, 8</samp>&rsquo;</dt>
+<dd><p>Only show fatal errors. These are errors after which the process absolutely
+cannot continue.
+</p></dd>
+<dt>&lsquo;<samp>error, 16</samp>&rsquo;</dt>
+<dd><p>Show all errors, including ones which can be recovered from.
+</p></dd>
+<dt>&lsquo;<samp>warning, 24</samp>&rsquo;</dt>
+<dd><p>Show all warnings and errors. Any message related to possibly
+incorrect or unexpected events will be shown.
+</p></dd>
+<dt>&lsquo;<samp>info, 32</samp>&rsquo;</dt>
+<dd><p>Show informative messages during processing. This is in addition to
+warnings and errors. This is the default value.
+</p></dd>
+<dt>&lsquo;<samp>verbose, 40</samp>&rsquo;</dt>
+<dd><p>Same as <code>info</code>, except more verbose.
+</p></dd>
+<dt>&lsquo;<samp>debug, 48</samp>&rsquo;</dt>
+<dd><p>Show everything, including debugging information.
+</p></dd>
+<dt>&lsquo;<samp>trace, 56</samp>&rsquo;</dt>
+</dl>
+
+<p>For example to enable repeated log output, add the <code>level</code> prefix, and set
+<var>loglevel</var> to <code>verbose</code>:
+</p><div class="example">
+<pre class="example">ffmpeg -loglevel repeat+level+verbose -i input output
+</pre></div>
+<p>Another example that enables repeated log output without affecting current
+state of <code>level</code> prefix flag or <var>loglevel</var>:
+</p><div class="example">
+<pre class="example">ffmpeg [...] -loglevel +repeat
+</pre></div>
+
+<p>By default the program logs to stderr. If coloring is supported by the
+terminal, colors are used to mark errors and warnings. Log coloring
+can be disabled setting the environment variable
+<code>AV_LOG_FORCE_NOCOLOR</code>, or can be forced setting
+the environment variable <code>AV_LOG_FORCE_COLOR</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-report</samp>&rsquo;</dt>
+<dd><p>Dump full command line and log output to a file named
+<code><var>program</var>-<var>YYYYMMDD</var>-<var>HHMMSS</var>.log</code> in the current
+directory.
+This file can be useful for bug reports.
+It also implies <code>-loglevel debug</code>.
+</p>
+<p>Setting the environment variable <code>FFREPORT</code> to any value has the
+same effect. If the value is a &rsquo;:&rsquo;-separated key=value sequence, these
+options will affect the report; option values must be escaped if they
+contain special characters or the options delimiter &rsquo;:&rsquo; (see the
+&ldquo;Quoting and escaping&rdquo; section in the ffmpeg-utils manual).
+</p>
+<p>The following options are recognized:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>file</samp>&rsquo;</dt>
+<dd><p>set the file name to use for the report; <code>%p</code> is expanded to the name
+of the program, <code>%t</code> is expanded to a timestamp, <code>%%</code> is expanded
+to a plain <code>%</code>
+</p></dd>
+<dt>&lsquo;<samp>level</samp>&rsquo;</dt>
+<dd><p>set the log verbosity level using a numerical value (see <code>-loglevel</code>).
+</p></dd>
+</dl>
+
+<p>For example, to output a report to a file named &lsquo;<tt>ffreport.log</tt>&rsquo;
+using a log level of <code>32</code> (alias for log level <code>info</code>):
+</p>
+<div class="example">
+<pre class="example">FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
+</pre></div>
+
+<p>Errors in parsing the environment variable are not fatal, and will not
+appear in the report.
+</p>
+</dd>
+<dt>&lsquo;<samp>-hide_banner</samp>&rsquo;</dt>
+<dd><p>Suppress printing banner.
+</p>
+<p>All FFmpeg tools will normally show a copyright notice, build options
+and library versions. This option can be used to suppress printing
+this information.
+</p>
+</dd>
+<dt>&lsquo;<samp>-cpuflags flags (<em>global</em>)</samp>&rsquo;</dt>
+<dd><p>Allows setting and clearing cpu flags. This option is intended
+for testing. Do not use it unless you know what you&rsquo;re doing.
+</p><div class="example">
+<pre class="example">ffmpeg -cpuflags -sse+mmx ...
+ffmpeg -cpuflags mmx ...
+ffmpeg -cpuflags 0 ...
+</pre></div>
+<p>Possible flags for this option are:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>x86</samp>&rsquo;</dt>
+<dd><dl compact="compact">
+<dt>&lsquo;<samp>mmx</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>mmxext</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse2</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse2slow</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse3</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse3slow</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>ssse3</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>atom</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse4.1</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>sse4.2</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>avx</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>avx2</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>xop</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>fma3</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>fma4</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>3dnow</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>3dnowext</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bmi1</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>bmi2</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>cmov</samp>&rsquo;</dt>
+</dl>
+</dd>
+<dt>&lsquo;<samp>ARM</samp>&rsquo;</dt>
+<dd><dl compact="compact">
+<dt>&lsquo;<samp>armv5te</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>armv6</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>armv6t2</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>vfp</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>vfpv3</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>neon</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>setend</samp>&rsquo;</dt>
+</dl>
+</dd>
+<dt>&lsquo;<samp>AArch64</samp>&rsquo;</dt>
+<dd><dl compact="compact">
+<dt>&lsquo;<samp>armv8</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>vfp</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>neon</samp>&rsquo;</dt>
+</dl>
+</dd>
+<dt>&lsquo;<samp>PowerPC</samp>&rsquo;</dt>
+<dd><dl compact="compact">
+<dt>&lsquo;<samp>altivec</samp>&rsquo;</dt>
+</dl>
+</dd>
+<dt>&lsquo;<samp>Specific Processors</samp>&rsquo;</dt>
+<dd><dl compact="compact">
+<dt>&lsquo;<samp>pentium2</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>pentium3</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>pentium4</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>k6</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>k62</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>athlon</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>athlonxp</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>k8</samp>&rsquo;</dt>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+
+<a name="AVOptions"></a>
+<h2 class="section"><a href="ffplay.html#toc-AVOptions">3.3 AVOptions</a></h2>
+
+<p>These options are provided directly by the libavformat, libavdevice and
+libavcodec libraries. To see the list of available AVOptions, use the
+&lsquo;<samp>-help</samp>&rsquo; option. They are separated into two categories:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>generic</samp>&rsquo;</dt>
+<dd><p>These options can be set for any container, codec or device. Generic options
+are listed under AVFormatContext options for containers/devices and under
+AVCodecContext options for codecs.
+</p></dd>
+<dt>&lsquo;<samp>private</samp>&rsquo;</dt>
+<dd><p>These options are specific to the given container, device or codec. Private
+options are listed under their corresponding containers/devices/codecs.
+</p></dd>
+</dl>
+
+<p>For example to write an ID3v2.3 header instead of a default ID3v2.4 to
+an MP3 file, use the &lsquo;<samp>id3v2_version</samp>&rsquo; private option of the MP3
+muxer:
+</p><div class="example">
+<pre class="example">ffmpeg -i input.flac -id3v2_version 3 out.mp3
+</pre></div>
+
+<p>All codec AVOptions are per-stream, and thus a stream specifier
+should be attached to them:
+</p><div class="example">
+<pre class="example">ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
+</pre></div>
+
+<p>In the above example, a multichannel audio stream is mapped twice for output.
+The first instance is encoded with codec ac3 and bitrate 640k.
+The second instance is downmixed to 2 channels and encoded with codec aac. A bitrate of 128k is specified for it using
+absolute index of the output stream.
+</p>
+<p>Note: the &lsquo;<samp>-nooption</samp>&rsquo; syntax cannot be used for boolean
+AVOptions, use &lsquo;<samp>-option 0</samp>&rsquo;/&lsquo;<samp>-option 1</samp>&rsquo;.
+</p>
+<p>Note: the old undocumented way of specifying per-stream AVOptions by
+prepending v/a/s to the options name is now obsolete and will be
+removed soon.
+</p>
+<a name="Main-options"></a>
+<h2 class="section"><a href="ffplay.html#toc-Main-options">3.4 Main options</a></h2>
+
+<dl compact="compact">
+<dt>&lsquo;<samp>-x <var>width</var></samp>&rsquo;</dt>
+<dd><p>Force displayed width.
+</p></dd>
+<dt>&lsquo;<samp>-y <var>height</var></samp>&rsquo;</dt>
+<dd><p>Force displayed height.
+</p></dd>
+<dt>&lsquo;<samp>-s <var>size</var></samp>&rsquo;</dt>
+<dd><p>Set frame size (WxH or abbreviation), needed for videos which do
+not contain a header with the frame size like raw YUV.  This option
+has been deprecated in favor of private options, try -video_size.
+</p></dd>
+<dt>&lsquo;<samp>-fs</samp>&rsquo;</dt>
+<dd><p>Start in fullscreen mode.
+</p></dd>
+<dt>&lsquo;<samp>-an</samp>&rsquo;</dt>
+<dd><p>Disable audio.
+</p></dd>
+<dt>&lsquo;<samp>-vn</samp>&rsquo;</dt>
+<dd><p>Disable video.
+</p></dd>
+<dt>&lsquo;<samp>-sn</samp>&rsquo;</dt>
+<dd><p>Disable subtitles.
+</p></dd>
+<dt>&lsquo;<samp>-ss <var>pos</var></samp>&rsquo;</dt>
+<dd><p>Seek to <var>pos</var>. Note that in most formats it is not possible to seek
+exactly, so <code>ffplay</code> will seek to the nearest seek point to
+<var>pos</var>.
+</p>
+<p><var>pos</var> must be a time duration specification,
+see <a href="ffmpeg-utils.html#time-duration-syntax">(ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual</a>.
+</p></dd>
+<dt>&lsquo;<samp>-t <var>duration</var></samp>&rsquo;</dt>
+<dd><p>Play <var>duration</var> seconds of audio/video.
+</p>
+<p><var>duration</var> must be a time duration specification,
+see <a href="ffmpeg-utils.html#time-duration-syntax">(ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual</a>.
+</p></dd>
+<dt>&lsquo;<samp>-bytes</samp>&rsquo;</dt>
+<dd><p>Seek by bytes.
+</p></dd>
+<dt>&lsquo;<samp>-seek_interval</samp>&rsquo;</dt>
+<dd><p>Set custom interval, in seconds, for seeking using left/right keys. Default is 10 seconds.
+</p></dd>
+<dt>&lsquo;<samp>-nodisp</samp>&rsquo;</dt>
+<dd><p>Disable graphical display.
+</p></dd>
+<dt>&lsquo;<samp>-noborder</samp>&rsquo;</dt>
+<dd><p>Borderless window.
+</p></dd>
+<dt>&lsquo;<samp>-alwaysontop</samp>&rsquo;</dt>
+<dd><p>Window always on top. Available on: X11 with SDL &gt;= 2.0.5, Windows SDL &gt;= 2.0.6.
+</p></dd>
+<dt>&lsquo;<samp>-volume</samp>&rsquo;</dt>
+<dd><p>Set the startup volume. 0 means silence, 100 means no volume reduction or
+amplification. Negative values are treated as 0, values above 100 are treated
+as 100.
+</p></dd>
+<dt>&lsquo;<samp>-f <var>fmt</var></samp>&rsquo;</dt>
+<dd><p>Force format.
+</p></dd>
+<dt>&lsquo;<samp>-window_title <var>title</var></samp>&rsquo;</dt>
+<dd><p>Set window title (default is the input filename).
+</p></dd>
+<dt>&lsquo;<samp>-left <var>title</var></samp>&rsquo;</dt>
+<dd><p>Set the x position for the left of the window (default is a centered window).
+</p></dd>
+<dt>&lsquo;<samp>-top <var>title</var></samp>&rsquo;</dt>
+<dd><p>Set the y position for the top of the window (default is a centered window).
+</p></dd>
+<dt>&lsquo;<samp>-loop <var>number</var></samp>&rsquo;</dt>
+<dd><p>Loops movie playback &lt;number&gt; times. 0 means forever.
+</p></dd>
+<dt>&lsquo;<samp>-showmode <var>mode</var></samp>&rsquo;</dt>
+<dd><p>Set the show mode to use.
+Available values for <var>mode</var> are:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>0, video</samp>&rsquo;</dt>
+<dd><p>show video
+</p></dd>
+<dt>&lsquo;<samp>1, waves</samp>&rsquo;</dt>
+<dd><p>show audio waves
+</p></dd>
+<dt>&lsquo;<samp>2, rdft</samp>&rsquo;</dt>
+<dd><p>show audio frequency band using RDFT ((Inverse) Real Discrete Fourier Transform)
+</p></dd>
+</dl>
+
+<p>Default value is &quot;video&quot;, if video is not present or cannot be played
+&quot;rdft&quot; is automatically selected.
+</p>
+<p>You can interactively cycle through the available show modes by
+pressing the key &lt;w&gt;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-vf <var>filtergraph</var></samp>&rsquo;</dt>
+<dd><p>Create the filtergraph specified by <var>filtergraph</var> and use it to
+filter the video stream.
+</p>
+<p><var>filtergraph</var> is a description of the filtergraph to apply to
+the stream, and must have a single video input and a single video
+output. In the filtergraph, the input is associated to the label
+<code>in</code>, and the output to the label <code>out</code>. See the
+ffmpeg-filters manual for more information about the filtergraph
+syntax.
+</p>
+<p>You can specify this parameter multiple times and cycle through the specified
+filtergraphs along with the show modes by pressing the key &lt;w&gt;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-af <var>filtergraph</var></samp>&rsquo;</dt>
+<dd><p><var>filtergraph</var> is a description of the filtergraph to apply to
+the input audio.
+Use the option &quot;-filters&quot; to show all the available filters (including
+sources and sinks).
+</p>
+</dd>
+<dt>&lsquo;<samp>-i <var>input_url</var></samp>&rsquo;</dt>
+<dd><p>Read <var>input_url</var>.
+</p></dd>
+</dl>
+
+<a name="Advanced-options"></a>
+<h2 class="section"><a href="ffplay.html#toc-Advanced-options">3.5 Advanced options</a></h2>
+<dl compact="compact">
+<dt>&lsquo;<samp>-pix_fmt <var>format</var></samp>&rsquo;</dt>
+<dd><p>Set pixel format.
+This option has been deprecated in favor of private options, try -pixel_format.
+</p>
+</dd>
+<dt>&lsquo;<samp>-stats</samp>&rsquo;</dt>
+<dd><p>Print several playback statistics, in particular show the stream
+duration, the codec parameters, the current position in the stream and
+the audio/video synchronisation drift. It is shown by default, unless the
+log level is lower than <code>info</code>. Its display can be forced by manually
+specifying this option. To disable it, you need to specify <code>-nostats</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-fast</samp>&rsquo;</dt>
+<dd><p>Non-spec-compliant optimizations.
+</p></dd>
+<dt>&lsquo;<samp>-genpts</samp>&rsquo;</dt>
+<dd><p>Generate pts.
+</p></dd>
+<dt>&lsquo;<samp>-sync <var>type</var></samp>&rsquo;</dt>
+<dd><p>Set the master clock to audio (<code>type=audio</code>), video
+(<code>type=video</code>) or external (<code>type=ext</code>). Default is audio. The
+master clock is used to control audio-video synchronization. Most media
+players use audio as master clock, but in some cases (streaming or high
+quality broadcast) it is necessary to change that. This option is mainly
+used for debugging purposes.
+</p></dd>
+<dt>&lsquo;<samp>-ast <var>audio_stream_specifier</var></samp>&rsquo;</dt>
+<dd><p>Select the desired audio stream using the given stream specifier. The stream
+specifiers are described in the <a href="#Stream-specifiers">Stream specifiers</a> chapter. If this option
+is not specified, the &quot;best&quot; audio stream is selected in the program of the
+already selected video stream.
+</p></dd>
+<dt>&lsquo;<samp>-vst <var>video_stream_specifier</var></samp>&rsquo;</dt>
+<dd><p>Select the desired video stream using the given stream specifier. The stream
+specifiers are described in the <a href="#Stream-specifiers">Stream specifiers</a> chapter. If this option
+is not specified, the &quot;best&quot; video stream is selected.
+</p></dd>
+<dt>&lsquo;<samp>-sst <var>subtitle_stream_specifier</var></samp>&rsquo;</dt>
+<dd><p>Select the desired subtitle stream using the given stream specifier. The stream
+specifiers are described in the <a href="#Stream-specifiers">Stream specifiers</a> chapter. If this option
+is not specified, the &quot;best&quot; subtitle stream is selected in the program of the
+already selected video or audio stream.
+</p></dd>
+<dt>&lsquo;<samp>-autoexit</samp>&rsquo;</dt>
+<dd><p>Exit when video is done playing.
+</p></dd>
+<dt>&lsquo;<samp>-exitonkeydown</samp>&rsquo;</dt>
+<dd><p>Exit if any key is pressed.
+</p></dd>
+<dt>&lsquo;<samp>-exitonmousedown</samp>&rsquo;</dt>
+<dd><p>Exit if any mouse button is pressed.
+</p>
+</dd>
+<dt>&lsquo;<samp>-codec:<var>media_specifier</var> <var>codec_name</var></samp>&rsquo;</dt>
+<dd><p>Force a specific decoder implementation for the stream identified by
+<var>media_specifier</var>, which can assume the values <code>a</code> (audio),
+<code>v</code> (video), and <code>s</code> subtitle.
+</p>
+</dd>
+<dt>&lsquo;<samp>-acodec <var>codec_name</var></samp>&rsquo;</dt>
+<dd><p>Force a specific audio decoder.
+</p>
+</dd>
+<dt>&lsquo;<samp>-vcodec <var>codec_name</var></samp>&rsquo;</dt>
+<dd><p>Force a specific video decoder.
+</p>
+</dd>
+<dt>&lsquo;<samp>-scodec <var>codec_name</var></samp>&rsquo;</dt>
+<dd><p>Force a specific subtitle decoder.
+</p>
+</dd>
+<dt>&lsquo;<samp>-autorotate</samp>&rsquo;</dt>
+<dd><p>Automatically rotate the video according to file metadata. Enabled by
+default, use &lsquo;<samp>-noautorotate</samp>&rsquo; to disable it.
+</p>
+</dd>
+<dt>&lsquo;<samp>-framedrop</samp>&rsquo;</dt>
+<dd><p>Drop video frames if video is out of sync. Enabled by default if the master
+clock is not set to video. Use this option to enable frame dropping for all
+master clock sources, use &lsquo;<samp>-noframedrop</samp>&rsquo; to disable it.
+</p>
+</dd>
+<dt>&lsquo;<samp>-infbuf</samp>&rsquo;</dt>
+<dd><p>Do not limit the input buffer size, read as much data as possible from the
+input as soon as possible. Enabled by default for realtime streams, where data
+may be dropped if not read in time. Use this option to enable infinite buffers
+for all inputs, use &lsquo;<samp>-noinfbuf</samp>&rsquo; to disable it.
+</p>
+</dd>
+<dt>&lsquo;<samp>-filter_threads <var>nb_threads</var></samp>&rsquo;</dt>
+<dd><p>Defines how many threads are used to process a filter pipeline. Each pipeline
+will produce a thread pool with this many threads available for parallel
+processing. The default is 0 which means that the thread count will be
+determined by the number of available CPUs.
+</p>
+</dd>
+</dl>
+
+<a name="While-playing"></a>
+<h2 class="section"><a href="ffplay.html#toc-While-playing">3.6 While playing</a></h2>
+
+<dl compact="compact">
+<dt>&lt;q, ESC&gt;</dt>
+<dd><p>Quit.
+</p>
+</dd>
+<dt>&lt;f&gt;</dt>
+<dd><p>Toggle full screen.
+</p>
+</dd>
+<dt>&lt;p, SPC&gt;</dt>
+<dd><p>Pause.
+</p>
+</dd>
+<dt>&lt;m&gt;</dt>
+<dd><p>Toggle mute.
+</p>
+</dd>
+<dt>&lt;9, 0&gt;</dt>
+<dd><p>Decrease and increase volume respectively.
+</p>
+</dd>
+<dt>&lt;/, *&gt;</dt>
+<dd><p>Decrease and increase volume respectively.
+</p>
+</dd>
+<dt>&lt;a&gt;</dt>
+<dd><p>Cycle audio channel in the current program.
+</p>
+</dd>
+<dt>&lt;v&gt;</dt>
+<dd><p>Cycle video channel.
+</p>
+</dd>
+<dt>&lt;t&gt;</dt>
+<dd><p>Cycle subtitle channel in the current program.
+</p>
+</dd>
+<dt>&lt;c&gt;</dt>
+<dd><p>Cycle program.
+</p>
+</dd>
+<dt>&lt;w&gt;</dt>
+<dd><p>Cycle video filters or show modes.
+</p>
+</dd>
+<dt>&lt;s&gt;</dt>
+<dd><p>Step to the next frame.
+</p>
+<p>Pause if the stream is not already paused, step to the next video
+frame, and pause.
+</p>
+</dd>
+<dt>&lt;left/right&gt;</dt>
+<dd><p>Seek backward/forward 10 seconds.
+</p>
+</dd>
+<dt>&lt;down/up&gt;</dt>
+<dd><p>Seek backward/forward 1 minute.
+</p>
+</dd>
+<dt>&lt;page down/page up&gt;</dt>
+<dd><p>Seek to the previous/next chapter.
+or if there are no chapters
+Seek backward/forward 10 minutes.
+</p>
+</dd>
+<dt>&lt;right mouse click&gt;</dt>
+<dd><p>Seek to percentage in file corresponding to fraction of width.
+</p>
+</dd>
+<dt>&lt;left mouse double-click&gt;</dt>
+<dd><p>Toggle full screen.
+</p>
+</dd>
+</dl>
+
+
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="ffplay.html#toc-See-Also">4 See Also</a></h1>
+
+<p><a href="ffplay-all.html">ffmpeg-all</a>,
+<a href="ffmpeg.html">ffmpeg</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-utils.html">ffmpeg-utils</a>,
+<a href="ffmpeg-scaler.html">ffmpeg-scaler</a>,
+<a href="ffmpeg-resampler.html">ffmpeg-resampler</a>,
+<a href="ffmpeg-codecs.html">ffmpeg-codecs</a>,
+<a href="ffmpeg-bitstream-filters.html">ffmpeg-bitstream-filters</a>,
+<a href="ffmpeg-formats.html">ffmpeg-formats</a>,
+<a href="ffmpeg-devices.html">ffmpeg-devices</a>,
+<a href="ffmpeg-protocols.html">ffmpeg-protocols</a>,
+<a href="ffmpeg-filters.html">ffmpeg-filters</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="ffplay.html#toc-Authors">5 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

File diff suppressed because it is too large
+ 42121 - 0
ffmpeg/doc/ffprobe-all.html


File diff suppressed because it is too large
+ 1199 - 0
ffmpeg/doc/ffprobe.html


File diff suppressed because it is too large
+ 1271 - 0
ffmpeg/doc/general.html


+ 519 - 0
ffmpeg/doc/git-howto.html

@@ -0,0 +1,519 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Using Git to develop FFmpeg: ">
+<meta name="keywords" content="FFmpeg documentation : Using Git to develop FFmpeg: ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Using Git to develop FFmpeg</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Introduction" href="#Introduction">1 Introduction</a></li>
+  <li><a name="toc-Basics-Usage" href="#Basics-Usage">2 Basics Usage</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Get-Git" href="#Get-Git">2.1 Get Git</a></li>
+    <li><a name="toc-Cloning-the-source-tree" href="#Cloning-the-source-tree">2.2 Cloning the source tree</a></li>
+    <li><a name="toc-Updating-the-source-tree-to-the-latest-revision-1" href="#Updating-the-source-tree-to-the-latest-revision-1">2.3 Updating the source tree to the latest revision</a></li>
+    <li><a name="toc-Rebasing-your-local-branches" href="#Rebasing-your-local-branches">2.4 Rebasing your local branches</a></li>
+    <li><a name="toc-Adding_002fremoving-files_002fdirectories" href="#Adding_002fremoving-files_002fdirectories">2.5 Adding/removing files/directories</a></li>
+    <li><a name="toc-Showing-modifications" href="#Showing-modifications">2.6 Showing modifications</a></li>
+    <li><a name="toc-Inspecting-the-changelog" href="#Inspecting-the-changelog">2.7 Inspecting the changelog</a></li>
+    <li><a name="toc-Checking-source-tree-status" href="#Checking-source-tree-status">2.8 Checking source tree status</a></li>
+    <li><a name="toc-Committing" href="#Committing">2.9 Committing</a></li>
+    <li><a name="toc-Preparing-a-patchset" href="#Preparing-a-patchset">2.10 Preparing a patchset</a></li>
+    <li><a name="toc-Sending-patches-for-review" href="#Sending-patches-for-review">2.11 Sending patches for review</a></li>
+    <li><a name="toc-Renaming_002fmoving_002fcopying-files-or-contents-of-files" href="#Renaming_002fmoving_002fcopying-files-or-contents-of-files">2.12 Renaming/moving/copying files or contents of files</a></li>
+  </ul></li>
+  <li><a name="toc-Git-configuration" href="#Git-configuration">3 Git configuration</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Personal-Git-installation" href="#Personal-Git-installation">3.1 Personal Git installation</a></li>
+    <li><a name="toc-Repository-configuration" href="#Repository-configuration">3.2 Repository configuration</a></li>
+  </ul></li>
+  <li><a name="toc-FFmpeg-specific" href="#FFmpeg-specific">4 FFmpeg specific</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Reverting-broken-commits" href="#Reverting-broken-commits">4.1 Reverting broken commits</a></li>
+    <li><a name="toc-Pushing-changes-to-remote-trees" href="#Pushing-changes-to-remote-trees">4.2 Pushing changes to remote trees</a></li>
+    <li><a name="toc-Finding-a-specific-svn-revision" href="#Finding-a-specific-svn-revision">4.3 Finding a specific svn revision</a></li>
+  </ul></li>
+  <li><a name="toc-Pre_002dpush-checklist" href="#Pre_002dpush-checklist">5 Pre-push checklist</a></li>
+  <li><a name="toc-Server-Issues" href="#Server-Issues">6 Server Issues</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Introduction"></a>
+<h1 class="chapter"><a href="git-howto.html#toc-Introduction">1 Introduction</a></h1>
+
+<p>This document aims in giving some quick references on a set of useful Git
+commands. You should always use the extensive and detailed documentation
+provided directly by Git:
+</p>
+<div class="example">
+<pre class="example">git --help
+man git
+</pre></div>
+
+<p>shows you the available subcommands,
+</p>
+<div class="example">
+<pre class="example">git &lt;command&gt; --help
+man git-&lt;command&gt;
+</pre></div>
+
+<p>shows information about the subcommand &lt;command&gt;.
+</p>
+<p>Additional information could be found on the
+<a href="http://gitref.org">Git Reference</a> website.
+</p>
+<p>For more information about the Git project, visit the
+<a href="http://git-scm.com/">Git website</a>.
+</p>
+<p>Consult these resources whenever you have problems, they are quite exhaustive.
+</p>
+<p>What follows now is a basic introduction to Git and some FFmpeg-specific
+guidelines to ease the contribution to the project.
+</p>
+<a name="Basics-Usage"></a>
+<h1 class="chapter"><a href="git-howto.html#toc-Basics-Usage">2 Basics Usage</a></h1>
+
+<a name="Get-Git"></a>
+<h2 class="section"><a href="git-howto.html#toc-Get-Git">2.1 Get Git</a></h2>
+
+<p>You can get Git from <a href="http://git-scm.com/">http://git-scm.com/</a>
+Most distribution and operating system provide a package for it.
+</p>
+
+<a name="Cloning-the-source-tree"></a>
+<h2 class="section"><a href="git-howto.html#toc-Cloning-the-source-tree">2.2 Cloning the source tree</a></h2>
+
+<div class="example">
+<pre class="example">git clone git://source.ffmpeg.org/ffmpeg &lt;target&gt;
+</pre></div>
+
+<p>This will put the FFmpeg sources into the directory <var>&lt;target&gt;</var>.
+</p>
+<div class="example">
+<pre class="example">git clone git@source.ffmpeg.org:ffmpeg &lt;target&gt;
+</pre></div>
+
+<p>This will put the FFmpeg sources into the directory <var>&lt;target&gt;</var> and let
+you push back your changes to the remote repository.
+</p>
+<div class="example">
+<pre class="example">git clone gil@ffmpeg.org:ffmpeg-web &lt;target&gt;
+</pre></div>
+
+<p>This will put the source of the FFmpeg website into the directory
+<var>&lt;target&gt;</var> and let you push back your changes to the remote repository.
+(Note that <var>gil</var> stands for GItoLite and is not a typo of <var>git</var>.)
+</p>
+<p>If you don&rsquo;t have write-access to the ffmpeg-web repository, you can
+create patches after making a read-only ffmpeg-web clone:
+</p>
+<div class="example">
+<pre class="example">git clone git://ffmpeg.org/ffmpeg-web &lt;target&gt;
+</pre></div>
+
+<p>Make sure that you do not have Windows line endings in your checkouts,
+otherwise you may experience spurious compilation failures. One way to
+achieve this is to run
+</p>
+<div class="example">
+<pre class="example">git config --global core.autocrlf false
+</pre></div>
+
+
+<p><a name="Updating-the-source-tree-to-the-latest-revision"></a>
+</p><a name="Updating-the-source-tree-to-the-latest-revision-1"></a>
+<h2 class="section"><a href="git-howto.html#toc-Updating-the-source-tree-to-the-latest-revision-1">2.3 Updating the source tree to the latest revision</a></h2>
+
+<div class="example">
+<pre class="example">git pull (--rebase)
+</pre></div>
+
+<p>pulls in the latest changes from the tracked branch. The tracked branch
+can be remote. By default the master branch tracks the branch master in
+the remote origin.
+</p>
+<div class="float alert alert-warning">
+<p><code>--rebase</code> (see below) is recommended.
+</p></div>
+<a name="Rebasing-your-local-branches"></a>
+<h2 class="section"><a href="git-howto.html#toc-Rebasing-your-local-branches">2.4 Rebasing your local branches</a></h2>
+
+<div class="example">
+<pre class="example">git pull --rebase
+</pre></div>
+
+<p>fetches the changes from the main repository and replays your local commits
+over it. This is required to keep all your local changes at the top of
+FFmpeg&rsquo;s master tree. The master tree will reject pushes with merge commits.
+</p>
+
+<a name="Adding_002fremoving-files_002fdirectories"></a>
+<h2 class="section"><a href="git-howto.html#toc-Adding_002fremoving-files_002fdirectories">2.5 Adding/removing files/directories</a></h2>
+
+<div class="example">
+<pre class="example">git add [-A] &lt;filename/dirname&gt;
+git rm [-r] &lt;filename/dirname&gt;
+</pre></div>
+
+<p>Git needs to get notified of all changes you make to your working
+directory that makes files appear or disappear.
+Line moves across files are automatically tracked.
+</p>
+
+<a name="Showing-modifications"></a>
+<h2 class="section"><a href="git-howto.html#toc-Showing-modifications">2.6 Showing modifications</a></h2>
+
+<div class="example">
+<pre class="example">git diff &lt;filename(s)&gt;
+</pre></div>
+
+<p>will show all local modifications in your working directory as unified diff.
+</p>
+
+<a name="Inspecting-the-changelog"></a>
+<h2 class="section"><a href="git-howto.html#toc-Inspecting-the-changelog">2.7 Inspecting the changelog</a></h2>
+
+<div class="example">
+<pre class="example">git log &lt;filename(s)&gt;
+</pre></div>
+
+<p>You may also use the graphical tools like <code>gitview</code> or <code>gitk</code>
+or the web interface available at <a href="http://source.ffmpeg.org/">http://source.ffmpeg.org/</a>.
+</p>
+<a name="Checking-source-tree-status"></a>
+<h2 class="section"><a href="git-howto.html#toc-Checking-source-tree-status">2.8 Checking source tree status</a></h2>
+
+<div class="example">
+<pre class="example">git status
+</pre></div>
+
+<p>detects all the changes you made and lists what actions will be taken in case
+of a commit (additions, modifications, deletions, etc.).
+</p>
+
+<a name="Committing"></a>
+<h2 class="section"><a href="git-howto.html#toc-Committing">2.9 Committing</a></h2>
+
+<div class="example">
+<pre class="example">git diff --check
+</pre></div>
+
+<p>to double check your changes before committing them to avoid trouble later
+on. All experienced developers do this on each and every commit, no matter
+how small.
+</p>
+<p>Every one of them has been saved from looking like a fool by this many times.
+It&rsquo;s very easy for stray debug output or cosmetic modifications to slip in,
+please avoid problems through this extra level of scrutiny.
+</p>
+<p>For cosmetics-only commits you should get (almost) empty output from
+</p>
+<div class="example">
+<pre class="example">git diff -w -b &lt;filename(s)&gt;
+</pre></div>
+
+<p>Also check the output of
+</p>
+<div class="example">
+<pre class="example">git status
+</pre></div>
+
+<p>to make sure you don&rsquo;t have untracked files or deletions.
+</p>
+<div class="example">
+<pre class="example">git add [-i|-p|-A] &lt;filenames/dirnames&gt;
+</pre></div>
+
+<p>Make sure you have told Git your name and email address
+</p>
+<div class="example">
+<pre class="example">git config --global user.name &quot;My Name&quot;
+git config --global user.email my@email.invalid
+</pre></div>
+
+<p>Use &lsquo;<samp>--global</samp>&rsquo; to set the global configuration for all your Git checkouts.
+</p>
+<p>Git will select the changes to the files for commit. Optionally you can use
+the interactive or the patch mode to select hunk by hunk what should be
+added to the commit.
+</p>
+
+<div class="example">
+<pre class="example">git commit
+</pre></div>
+
+<p>Git will commit the selected changes to your current local branch.
+</p>
+<p>You will be prompted for a log message in an editor, which is either
+set in your personal configuration file through
+</p>
+<div class="example">
+<pre class="example">git config --global core.editor
+</pre></div>
+
+<p>or set by one of the following environment variables:
+<var>GIT_EDITOR</var>, <var>VISUAL</var> or <var>EDITOR</var>.
+</p>
+<p>Log messages should be concise but descriptive. Explain why you made a change,
+what you did will be obvious from the changes themselves most of the time.
+Saying just &quot;bug fix&quot; or &quot;10l&quot; is bad. Remember that people of varying skill
+levels look at and educate themselves while reading through your code. Don&rsquo;t
+include filenames in log messages, Git provides that information.
+</p>
+<p>Possibly make the commit message have a terse, descriptive first line, an
+empty line and then a full description. The first line will be used to name
+the patch by <code>git format-patch</code>.
+</p>
+<a name="Preparing-a-patchset"></a>
+<h2 class="section"><a href="git-howto.html#toc-Preparing-a-patchset">2.10 Preparing a patchset</a></h2>
+
+<div class="example">
+<pre class="example">git format-patch &lt;commit&gt; [-o directory]
+</pre></div>
+
+<p>will generate a set of patches for each commit between <var>&lt;commit&gt;</var> and
+current <var>HEAD</var>. E.g.
+</p>
+<div class="example">
+<pre class="example">git format-patch origin/master
+</pre></div>
+
+<p>will generate patches for all commits on current branch which are not
+present in upstream.
+A useful shortcut is also
+</p>
+<div class="example">
+<pre class="example">git format-patch -n
+</pre></div>
+
+<p>which will generate patches from last <var>n</var> commits.
+By default the patches are created in the current directory.
+</p>
+<a name="Sending-patches-for-review"></a>
+<h2 class="section"><a href="git-howto.html#toc-Sending-patches-for-review">2.11 Sending patches for review</a></h2>
+
+<div class="example">
+<pre class="example">git send-email &lt;commit list|directory&gt;
+</pre></div>
+
+<p>will send the patches created by <code>git format-patch</code> or directly
+generates them. All the email fields can be configured in the global/local
+configuration or overridden by command line.
+Note that this tool must often be installed separately (e.g. <var>git-email</var>
+package on Debian-based distros).
+</p>
+
+<a name="Renaming_002fmoving_002fcopying-files-or-contents-of-files"></a>
+<h2 class="section"><a href="git-howto.html#toc-Renaming_002fmoving_002fcopying-files-or-contents-of-files">2.12 Renaming/moving/copying files or contents of files</a></h2>
+
+<p>Git automatically tracks such changes, making those normal commits.
+</p>
+<div class="example">
+<pre class="example">mv/cp path/file otherpath/otherfile
+git add [-A] .
+git commit
+</pre></div>
+
+
+<a name="Git-configuration"></a>
+<h1 class="chapter"><a href="git-howto.html#toc-Git-configuration">3 Git configuration</a></h1>
+
+<p>In order to simplify a few workflows, it is advisable to configure both
+your personal Git installation and your local FFmpeg repository.
+</p>
+<a name="Personal-Git-installation"></a>
+<h2 class="section"><a href="git-howto.html#toc-Personal-Git-installation">3.1 Personal Git installation</a></h2>
+
+<p>Add the following to your &lsquo;<tt>~/.gitconfig</tt>&rsquo; to help <code>git send-email</code>
+and <code>git format-patch</code> detect renames:
+</p>
+<div class="example">
+<pre class="example">[diff]
+        renames = copy
+</pre></div>
+
+<a name="Repository-configuration"></a>
+<h2 class="section"><a href="git-howto.html#toc-Repository-configuration">3.2 Repository configuration</a></h2>
+
+<p>In order to have <code>git send-email</code> automatically send patches
+to the ffmpeg-devel mailing list, add the following stanza
+to &lsquo;<tt>/path/to/ffmpeg/repository/.git/config</tt>&rsquo;:
+</p>
+<div class="example">
+<pre class="example">[sendemail]
+        to = ffmpeg-devel@ffmpeg.org
+</pre></div>
+
+<a name="FFmpeg-specific"></a>
+<h1 class="chapter"><a href="git-howto.html#toc-FFmpeg-specific">4 FFmpeg specific</a></h1>
+
+<a name="Reverting-broken-commits"></a>
+<h2 class="section"><a href="git-howto.html#toc-Reverting-broken-commits">4.1 Reverting broken commits</a></h2>
+
+<div class="example">
+<pre class="example">git reset &lt;commit&gt;
+</pre></div>
+
+<p><code>git reset</code> will uncommit the changes till <var>&lt;commit&gt;</var> rewriting
+the current branch history.
+</p>
+<div class="example">
+<pre class="example">git commit --amend
+</pre></div>
+
+<p>allows one to amend the last commit details quickly.
+</p>
+<div class="example">
+<pre class="example">git rebase -i origin/master
+</pre></div>
+
+<p>will replay local commits over the main repository allowing to edit, merge
+or remove some of them in the process.
+</p>
+<div class="float alert alert-info">
+<p><code>git reset</code>, <code>git commit --amend</code> and <code>git rebase</code>
+rewrite history, so you should use them ONLY on your local or topic branches.
+The main repository will reject those changes.
+</p></div>
+<div class="example">
+<pre class="example">git revert &lt;commit&gt;
+</pre></div>
+
+<p><code>git revert</code> will generate a revert commit. This will not make the
+faulty commit disappear from the history.
+</p>
+<a name="Pushing-changes-to-remote-trees"></a>
+<h2 class="section"><a href="git-howto.html#toc-Pushing-changes-to-remote-trees">4.2 Pushing changes to remote trees</a></h2>
+
+<div class="example">
+<pre class="example">git push origin master --dry-run
+</pre></div>
+
+<p>Will simulate a push of the local master branch to the default remote
+(<var>origin</var>). And list which branches and ranges or commits would have been
+pushed.
+Git will prevent you from pushing changes if the local and remote trees are
+out of sync. Refer to <a href="#Updating-the-source-tree-to-the-latest-revision">Updating the source tree to the latest revision</a>.
+</p>
+<div class="example">
+<pre class="example">git remote add &lt;name&gt; &lt;url&gt;
+</pre></div>
+
+<p>Will add additional remote with a name reference, it is useful if you want
+to push your local branch for review on a remote host.
+</p>
+<div class="example">
+<pre class="example">git push &lt;remote&gt; &lt;refspec&gt;
+</pre></div>
+
+<p>Will push the changes to the <var>&lt;remote&gt;</var> repository.
+Omitting <var>&lt;refspec&gt;</var> makes <code>git push</code> update all the remote
+branches matching the local ones.
+</p>
+<a name="Finding-a-specific-svn-revision"></a>
+<h2 class="section"><a href="git-howto.html#toc-Finding-a-specific-svn-revision">4.3 Finding a specific svn revision</a></h2>
+
+<p>Since version 1.7.1 Git supports &lsquo;<samp>:/foo</samp>&rsquo; syntax for specifying commits
+based on a regular expression. see man gitrevisions
+</p>
+<div class="example">
+<pre class="example">git show :/'as revision 23456'
+</pre></div>
+
+<p>will show the svn changeset &lsquo;<samp>r23456</samp>&rsquo;. With older Git versions searching in
+the <code>git log</code> output is the easiest option (especially if a pager with
+search capabilities is used).
+</p>
+<p>This commit can be checked out with
+</p>
+<div class="example">
+<pre class="example">git checkout -b svn_23456 :/'as revision 23456'
+</pre></div>
+
+<p>or for Git &lt; 1.7.1 with
+</p>
+<div class="example">
+<pre class="example">git checkout -b svn_23456 $SHA1
+</pre></div>
+
+<p>where <var>$SHA1</var> is the commit hash from the <code>git log</code> output.
+</p>
+
+<a name="Pre_002dpush-checklist"></a>
+<h1 class="chapter"><a href="git-howto.html#toc-Pre_002dpush-checklist">5 Pre-push checklist</a></h1>
+
+<p>Once you have a set of commits that you feel are ready for pushing,
+work through the following checklist to doublecheck everything is in
+proper order. This list tries to be exhaustive. In case you are just
+pushing a typo in a comment, some of the steps may be unnecessary.
+Apply your common sense, but if in doubt, err on the side of caution.
+</p>
+<p>First, make sure that the commits and branches you are going to push
+match what you want pushed and that nothing is missing, extraneous or
+wrong. You can see what will be pushed by running the git push command
+with &lsquo;<samp>--dry-run</samp>&rsquo; first. And then inspecting the commits listed with
+<code>git log -p 1234567..987654</code>. The <code>git status</code> command
+may help in finding local changes that have been forgotten to be added.
+</p>
+<p>Next let the code pass through a full run of our test suite.
+</p>
+<ul>
+<li> <code>make distclean</code>
+</li><li> <code>/path/to/ffmpeg/configure</code>
+</li><li> <code>make fate</code>
+</li><li> if fate fails due to missing samples run <code>make fate-rsync</code> and retry
+</li></ul>
+
+<p>Make sure all your changes have been checked before pushing them, the
+test suite only checks against regressions and that only to some extend. It does
+obviously not check newly added features/code to be working unless you have
+added a test for that (which is recommended).
+</p>
+<p>Also note that every single commit should pass the test suite, not just
+the result of a series of patches.
+</p>
+<p>Once everything passed, push the changes to your public ffmpeg clone and post a
+merge request to ffmpeg-devel. You can also push them directly but this is not
+recommended.
+</p>
+<a name="Server-Issues"></a>
+<h1 class="chapter"><a href="git-howto.html#toc-Server-Issues">6 Server Issues</a></h1>
+
+<p>Contact the project admins at <a href="mailto:root@ffmpeg.org">root@ffmpeg.org</a> if you have technical
+problems with the Git server.
+</p>    </div>
+  </body>
+</html>
+

+ 84 - 0
ffmpeg/doc/libavcodec.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libavcodec Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libavcodec ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libavcodec Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libavcodec.html#toc-Description">1 Description</a></h1>
+
+<p>The libavcodec library provides a generic encoding/decoding framework
+and contains multiple decoders and encoders for audio, video and
+subtitle streams, and several bitstream filters.
+</p>
+<p>The shared architecture provides various services ranging from bit
+stream I/O to DSP optimizations, and makes it suitable for
+implementing robust and fast codecs as well as for experimentation.
+</p>
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libavcodec.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-codecs.html">ffmpeg-codecs</a>, <a href="ffmpeg-bitstream-filters.html">bitstream-filters</a>,
+<a href="libavutil.html">libavutil</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libavcodec.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 81 - 0
ffmpeg/doc/libavdevice.html

@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libavdevice Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libavdevice ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libavdevice Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libavdevice.html#toc-Description">1 Description</a></h1>
+
+<p>The libavdevice library provides a generic framework for grabbing from
+and rendering to many common multimedia input/output devices, and
+supports several input and output devices, including Video4Linux2,
+VfW, DShow, and ALSA.
+</p>
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libavdevice.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-devices.html">ffmpeg-devices</a>,
+<a href="libavutil.html">libavutil</a>, <a href="libavcodec.html">libavcodec</a>, <a href="libavformat.html">libavformat</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libavdevice.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 80 - 0
ffmpeg/doc/libavfilter.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libavfilter Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libavfilter ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libavfilter Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libavfilter.html#toc-Description">1 Description</a></h1>
+
+<p>The libavfilter library provides a generic audio/video filtering
+framework containing several filters, sources and sinks.
+</p>
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libavfilter.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-filters.html">ffmpeg-filters</a>,
+<a href="libavutil.html">libavutil</a>, <a href="libswscale.html">libswscale</a>, <a href="libswresample.html">libswresample</a>,
+<a href="libavcodec.html">libavcodec</a>, <a href="libavformat.html">libavformat</a>, <a href="libavdevice.html">libavdevice</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libavfilter.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 84 - 0
ffmpeg/doc/libavformat.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libavformat Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libavformat ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libavformat Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libavformat.html#toc-Description">1 Description</a></h1>
+
+<p>The libavformat library provides a generic framework for multiplexing
+and demultiplexing (muxing and demuxing) audio, video and subtitle
+streams. It encompasses multiple muxers and demuxers for multimedia
+container formats.
+</p>
+<p>It also supports several input and output protocols to access a media
+resource.
+</p>
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libavformat.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-formats.html">ffmpeg-formats</a>, <a href="ffmpeg-protocols.html">ffmpeg-protocols</a>,
+<a href="libavutil.html">libavutil</a>, <a href="libavcodec.html">libavcodec</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libavformat.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 103 - 0
ffmpeg/doc/libavutil.html

@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libavutil Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libavutil ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libavutil Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libavutil.html#toc-Description">1 Description</a></h1>
+
+<p>The libavutil library is a utility library to aid portable
+multimedia programming. It contains safe portable string functions,
+random number generators, data structures, additional mathematics
+functions, cryptography and multimedia related functionality (like
+enumerations for pixel and sample formats). It is not a library for
+code needed by both libavcodec and libavformat.
+</p>
+<p>The goals for this library is to be:
+</p>
+<dl compact="compact">
+<dt><strong>Modular</strong></dt>
+<dd><p>It should have few interdependencies and the possibility of disabling individual
+parts during <code>./configure</code>.
+</p>
+</dd>
+<dt><strong>Small</strong></dt>
+<dd><p>Both sources and objects should be small.
+</p>
+</dd>
+<dt><strong>Efficient</strong></dt>
+<dd><p>It should have low CPU and memory usage.
+</p>
+</dd>
+<dt><strong>Useful</strong></dt>
+<dd><p>It should avoid useless features that almost no one needs.
+</p></dd>
+</dl>
+
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libavutil.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-utils.html">ffmpeg-utils</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libavutil.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 106 - 0
ffmpeg/doc/libswresample.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libswresample Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libswresample ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libswresample Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libswresample.html#toc-Description">1 Description</a></h1>
+
+<p>The libswresample library performs highly optimized audio resampling,
+rematrixing and sample format conversion operations.
+</p>
+<p>Specifically, this library performs the following conversions:
+</p>
+<ul>
+<li>
+<em>Resampling</em>: is the process of changing the audio rate, for
+example from a high sample rate of 44100Hz to 8000Hz. Audio
+conversion from high to low sample rate is a lossy process. Several
+resampling options and algorithms are available.
+
+</li><li>
+<em>Format conversion</em>: is the process of converting the type of
+samples, for example from 16-bit signed samples to unsigned 8-bit or
+float samples. It also handles packing conversion, when passing from
+packed layout (all samples belonging to distinct channels interleaved
+in the same buffer), to planar layout (all samples belonging to the
+same channel stored in a dedicated buffer or &quot;plane&quot;).
+
+</li><li>
+<em>Rematrixing</em>: is the process of changing the channel layout, for
+example from stereo to mono. When the input channels cannot be mapped
+to the output streams, the process is lossy, since it involves
+different gain factors and mixing.
+</li></ul>
+
+<p>Various other audio conversions (e.g. stretching and padding) are
+enabled through dedicated options.
+</p>
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libswresample.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-resampler.html">ffmpeg-resampler</a>,
+<a href="libavutil.html">libavutil</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libswresample.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 99 - 0
ffmpeg/doc/libswscale.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Libswscale Documentation: ">
+<meta name="keywords" content="FFmpeg documentation : Libswscale ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Libswscale Documentation</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-See-Also" href="#See-Also">2 See Also</a></li>
+  <li><a name="toc-Authors" href="#Authors">3 Authors</a></li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="libswscale.html#toc-Description">1 Description</a></h1>
+
+<p>The libswscale library performs highly optimized image scaling and
+colorspace and pixel format conversion operations.
+</p>
+<p>Specifically, this library performs the following conversions:
+</p>
+<ul>
+<li>
+<em>Rescaling</em>: is the process of changing the video size. Several
+rescaling options and algorithms are available. This is usually a
+lossy process.
+
+</li><li>
+<em>Pixel format conversion</em>: is the process of converting the image
+format and colorspace of the image, for example from planar YUV420P to
+RGB24 packed. It also handles packing conversion, that is converts
+from packed layout (all pixels belonging to distinct planes
+interleaved in the same buffer), to planar layout (all samples
+belonging to the same plane stored in a dedicated buffer or &quot;plane&quot;).
+
+<p>This is usually a lossy process in case the source and destination
+colorspaces differ.
+</p></li></ul>
+
+
+<a name="See-Also"></a>
+<h1 class="chapter"><a href="libswscale.html#toc-See-Also">2 See Also</a></h1>
+
+<p><a href="ffmpeg.html">ffmpeg</a>, <a href="ffplay.html">ffplay</a>, <a href="ffprobe.html">ffprobe</a>,
+<a href="ffmpeg-scaler.html">ffmpeg-scaler</a>,
+<a href="libavutil.html">libavutil</a>
+</p>
+
+<a name="Authors"></a>
+<h1 class="chapter"><a href="libswscale.html#toc-Authors">3 Authors</a></h1>
+
+<p>The FFmpeg developers.
+</p>
+<p>For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+<code>git log</code> in the FFmpeg source directory, or browsing the
+online repository at <a href="http://source.ffmpeg.org">http://source.ffmpeg.org</a>.
+</p>
+<p>Maintainers for the specific components are listed in the file
+&lsquo;<tt>MAINTAINERS</tt>&rsquo; in the source code tree.
+</p>
+
+    </div>
+  </body>
+</html>
+

+ 502 - 0
ffmpeg/doc/mailing-list-faq.html

@@ -0,0 +1,502 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="FFmpeg Mailing List FAQ: ">
+<meta name="keywords" content="FFmpeg documentation : FFmpeg Mailing List FAQ: ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">FFmpeg Mailing List FAQ</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-General-Questions" href="#General-Questions">1 General Questions</a>
+  <ul class="no-bullet">
+    <li><a name="toc-What-is-a-mailing-list_003f" href="#What-is-a-mailing-list_003f">1.1 What is a mailing list?</a></li>
+    <li><a name="toc-What-type-of-questions-can-I-ask_003f" href="#What-type-of-questions-can-I-ask_003f">1.2 What type of questions can I ask?</a></li>
+    <li><a name="toc-How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1" href="#How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1">1.3 How do I ask a question or send a message to a mailing list?</a></li>
+  </ul></li>
+  <li><a name="toc-Subscribing-_002f-Unsubscribing" href="#Subscribing-_002f-Unsubscribing">2 Subscribing / Unsubscribing</a>
+  <ul class="no-bullet">
+    <li><a name="toc-How-do-I-subscribe_003f-1" href="#How-do-I-subscribe_003f-1">2.1 How do I subscribe?</a></li>
+    <li><a name="toc-How-do-I-unsubscribe_003f" href="#How-do-I-unsubscribe_003f">2.2 How do I unsubscribe?</a></li>
+  </ul></li>
+  <li><a name="toc-Moderation-Queue" href="#Moderation-Queue">3 Moderation Queue</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Why-is-my-message-awaiting-moderator-approval_003f-1" href="#Why-is-my-message-awaiting-moderator-approval_003f-1">3.1 Why is my message awaiting moderator approval?</a></li>
+    <li><a name="toc-How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f" href="#How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f">3.2 How long does it take for my message in the moderation queue to be approved?</a></li>
+    <li><a name="toc-How-do-I-delete-my-message-in-the-moderation-queue_003f-1" href="#How-do-I-delete-my-message-in-the-moderation-queue_003f-1">3.3 How do I delete my message in the moderation queue?</a></li>
+  </ul></li>
+  <li><a name="toc-Archives" href="#Archives">4 Archives</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Where-are-the-archives_003f-1" href="#Where-are-the-archives_003f-1">4.1 Where are the archives?</a></li>
+    <li><a name="toc-How-do-I-reply-to-a-message-in-the-archives_003f" href="#How-do-I-reply-to-a-message-in-the-archives_003f">4.2 How do I reply to a message in the archives?</a></li>
+    <li><a name="toc-How-do-I-search-the-archives_003f" href="#How-do-I-search-the-archives_003f">4.3 How do I search the archives?</a></li>
+  </ul></li>
+  <li><a name="toc-Other" href="#Other">5 Other</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Is-there-an-alternative-to-the-mailing-list_003f" href="#Is-there-an-alternative-to-the-mailing-list_003f">5.1 Is there an alternative to the mailing list?</a></li>
+    <li><a name="toc-What-is-top_002dposting_003f-1" href="#What-is-top_002dposting_003f-1">5.2 What is top-posting?</a></li>
+    <li><a name="toc-What-is-the-message-size-limit_003f-1" href="#What-is-the-message-size-limit_003f-1">5.3 What is the message size limit?</a></li>
+    <li><a name="toc-Where-can-I-upload-sample-files_003f" href="#Where-can-I-upload-sample-files_003f">5.4 Where can I upload sample files?</a></li>
+    <li><a name="toc-Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f" href="#Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f">5.5 Will I receive spam if I send and/or subscribe to a mailing list?</a></li>
+    <li><a name="toc-How-do-I-filter-mailing-list-messages_003f" href="#How-do-I-filter-mailing-list-messages_003f">5.6 How do I filter mailing list messages?</a></li>
+    <li><a name="toc-How-do-I-disable-mail-delivery-without-unsubscribing_003f-1" href="#How-do-I-disable-mail-delivery-without-unsubscribing_003f-1">5.7 How do I disable mail delivery without unsubscribing?</a></li>
+    <li><a name="toc-Why-is-the-mailing-list-munging-my-address_003f-1" href="#Why-is-the-mailing-list-munging-my-address_003f-1">5.8 Why is the mailing list munging my address?</a></li>
+  </ul></li>
+  <li><a name="toc-Rules-and-Etiquette" href="#Rules-and-Etiquette">6 Rules and Etiquette</a>
+  <ul class="no-bullet">
+    <li><a name="toc-What-are-the-rules-and-the-proper-etiquette_003f" href="#What-are-the-rules-and-the-proper-etiquette_003f">6.1 What are the rules and the proper etiquette?</a></li>
+  </ul></li>
+  <li><a name="toc-Help" href="#Help">7 Help</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Why-am-I-not-receiving-any-messages_003f" href="#Why-am-I-not-receiving-any-messages_003f">7.1 Why am I not receiving any messages?</a></li>
+    <li><a name="toc-Why-are-my-sent-messages-not-showing-up_003f" href="#Why-are-my-sent-messages-not-showing-up_003f">7.2 Why are my sent messages not showing up?</a></li>
+    <li><a name="toc-Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1" href="#Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1">7.3 Why do I keep getting unsubscribed from ffmpeg-devel?</a></li>
+    <li><a name="toc-Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1" href="#Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1">7.4 Who do I contact if I have a problem with the mailing list?</a></li>
+  </ul>
+</li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="General-Questions"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-General-Questions">1 General Questions</a></h1>
+
+<a name="What-is-a-mailing-list_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-What-is-a-mailing-list_003f">1.1 What is a mailing list?</a></h2>
+
+<p>A mailing list is not much different than emailing someone, but the
+main difference is that your message is received by everyone who
+subscribes to the list. It is somewhat like a forum but in email form.
+</p>
+<p>See the <a href="https://lists.ffmpeg.org/pipermail/ffmpeg-user/">ffmpeg-user archives</a>
+for examples.
+</p>
+<a name="What-type-of-questions-can-I-ask_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-What-type-of-questions-can-I-ask_003f">1.2 What type of questions can I ask?</a></h2>
+
+<ul>
+<li>
+<a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user</a>:
+For questions involving unscripted usage or compilation of the FFmpeg
+command-line tools (<code>ffmpeg</code>, <code>ffprobe</code>, <code>ffplay</code>).
+
+</li><li>
+<a href="https://lists.ffmpeg.org/mailman/listinfo/libav-user/">libav-user</a>:
+For questions involving the FFmpeg libav* libraries (libavcodec,
+libavformat, libavfilter, etc).
+
+</li><li>
+<a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel/">ffmpeg-devel</a>:
+For discussions involving the development of FFmpeg and for submitting
+patches. User questions should be asked at ffmpeg-user or libav-user.
+</li></ul>
+
+<p>To report a bug see <a href="https://ffmpeg.org/bugreports.html">https://ffmpeg.org/bugreports.html</a>.
+</p>
+<p>We cannot provide help for scripts and/or third-party tools.
+</p>
+<p><a name="How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f"></a>
+</p><a name="How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1">1.3 How do I ask a question or send a message to a mailing list?</a></h2>
+
+<p>First you must <a href="#How-do-I-subscribe_003f">subscribe</a>. Then all you have to do is
+send an email:
+</p>
+<ul>
+<li>
+Email <a href="mailto:ffmpeg-user@ffmpeg.org">ffmpeg-user@ffmpeg.org</a> to send a message to the
+ffmpeg-user mailing list.
+
+</li><li>
+Email <a href="mailto:libav-user@ffmpeg.org">libav-user@ffmpeg.org</a> to send a message to the
+libav-user mailing list.
+
+</li><li>
+Email <a href="mailto:ffmpeg-devel@ffmpeg.org">ffmpeg-devel@ffmpeg.org</a> to send a message to the
+ffmpeg-devel mailing list.
+</li></ul>
+
+<a name="Subscribing-_002f-Unsubscribing"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-Subscribing-_002f-Unsubscribing">2 Subscribing / Unsubscribing</a></h1>
+
+<p><a name="How-do-I-subscribe_003f"></a>
+</p><a name="How-do-I-subscribe_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-subscribe_003f-1">2.1 How do I subscribe?</a></h2>
+
+<p>Email <a href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a> with the subject
+<em>subscribe</em>.
+</p>
+<p>Or visit the <a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user mailing list info page</a>
+and refer to the <em>Subscribing to ffmpeg-user</em> section.
+</p>
+<p>The process is the same for the other mailing lists.
+</p>
+<a name="How-do-I-unsubscribe_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-unsubscribe_003f">2.2 How do I unsubscribe?</a></h2>
+
+<p>Email <a href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a> with subject <em>unsubscribe</em>.
+</p>
+<p>Or visit the <a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user mailing list info page</a>,
+scroll to bottom of page, enter your email address in the box, and click
+the <em>Unsubscribe or edit options</em> button.
+</p>
+<p>The process is the same for the other mailing lists.
+</p>
+<p>Please avoid asking a mailing list admin to unsubscribe you unless you
+are absolutely unable to do so by yourself. See <a href="#Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f">Who do I contact if I have a problem with the mailing list?</a>
+</p>
+<p>Note that it is possible to temporarily halt message delivery (vacation mode).
+See <a href="#How-do-I-disable-mail-delivery-without-unsubscribing_003f">How do I disable mail delivery without unsubscribing?</a>
+</p>
+<a name="Moderation-Queue"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-Moderation-Queue">3 Moderation Queue</a></h1>
+<p><a name="Why-is-my-message-awaiting-moderator-approval_003f"></a>
+</p><a name="Why-is-my-message-awaiting-moderator-approval_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Why-is-my-message-awaiting-moderator-approval_003f-1">3.1 Why is my message awaiting moderator approval?</a></h2>
+
+<p>Some messages are automatically held in the <em>moderation queue</em> and
+must be manually approved by a mailing list admin:
+</p>
+<p>These are:
+</p>
+<ul>
+<li>
+Messages that exceed the <a href="#What-is-the-message-size-limit_003f">message size limit</a>.
+
+</li><li>
+Messages from users whose accounts have been set with the <em>moderation flag</em>
+(very rarely occurs, but may if a user repeatedly ignores the rules
+or is abusive towards others).
+</li></ul>
+
+<a name="How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f">3.2 How long does it take for my message in the moderation queue to be approved?</a></h2>
+
+<p>The queue is not checked on a regular basis. You can ask on the
+<tt>#ffmpeg-devel</tt> IRC channel on Freenode for someone to approve your message.
+</p>
+<p><a name="How-do-I-delete-my-message-in-the-moderation-queue_003f"></a>
+</p><a name="How-do-I-delete-my-message-in-the-moderation-queue_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-delete-my-message-in-the-moderation-queue_003f-1">3.3 How do I delete my message in the moderation queue?</a></h2>
+
+<p>You should have received an email with the subject <em>Your message to &lt;mailing list name&gt; awaits moderator approval</em>.
+A link is in the message that will allow you to delete your message
+unless a mailing list admin already approved or rejected it.
+</p>
+<a name="Archives"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-Archives">4 Archives</a></h1>
+
+<p><a name="Where-are-the-archives_003f"></a>
+</p><a name="Where-are-the-archives_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Where-are-the-archives_003f-1">4.1 Where are the archives?</a></h2>
+
+<p>See the <em>Archives</em> section on the <a href="https://ffmpeg.org/contact.html">FFmpeg Contact</a>
+page for links to all FFmpeg mailing list archives.
+</p>
+<p>Note that the archives are split by month. Discussions that span
+several months will be split into separate months in the archives.
+</p>
+<a name="How-do-I-reply-to-a-message-in-the-archives_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-reply-to-a-message-in-the-archives_003f">4.2 How do I reply to a message in the archives?</a></h2>
+
+<p>Click the email link at the top of the message just under the subject
+title. The link will provide the proper headers to keep the message
+within the thread.
+</p>
+<p>Note that you must be subscribed to send a message to the ffmpeg-user or
+libav-user mailing lists.
+</p>
+<a name="How-do-I-search-the-archives_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-search-the-archives_003f">4.3 How do I search the archives?</a></h2>
+
+<p>Perform a site search using your favorite search engine. Example:
+</p>
+<p><tt>site:lists.ffmpeg.org/pipermail/ffmpeg-user/ &quot;search term&quot;</tt>
+</p>
+<a name="Other"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-Other">5 Other</a></h1>
+
+<a name="Is-there-an-alternative-to-the-mailing-list_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Is-there-an-alternative-to-the-mailing-list_003f">5.1 Is there an alternative to the mailing list?</a></h2>
+
+<p>You can ask for help in the official <tt>#ffmpeg</tt> IRC channel on Freenode.
+</p>
+<p>Some users prefer the third-party <a href="http://www.ffmpeg-archive.org/">Nabble</a>
+interface which presents the mailing lists in a typical forum layout.
+</p>
+<p>There are also numerous third-party help sites such as
+<a href="https://superuser.com/tags/ffmpeg">Super User</a> and
+<a href="https://www.reddit.com/r/ffmpeg/">r/ffmpeg on reddit</a>.
+</p>
+<p><a name="What-is-top_002dposting_003f"></a>
+</p><a name="What-is-top_002dposting_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-What-is-top_002dposting_003f-1">5.2 What is top-posting?</a></h2>
+
+<p>See <a href="https://en.wikipedia.org/wiki/Posting_style#Top-posting">https://en.wikipedia.org/wiki/Posting_style#Top-posting</a>.
+</p>
+<p>Instead, use trimmed interleaved/inline replies (<a href="https://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-April/035849.html">example</a>).
+</p>
+<p><a name="What-is-the-message-size-limit_003f"></a>
+</p><a name="What-is-the-message-size-limit_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-What-is-the-message-size-limit_003f-1">5.3 What is the message size limit?</a></h2>
+
+<p>The message size limit is 1000 kilobytes. Please provide links to larger files
+instead of attaching them.
+</p>
+<a name="Where-can-I-upload-sample-files_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Where-can-I-upload-sample-files_003f">5.4 Where can I upload sample files?</a></h2>
+
+<p>Anywhere that is not too annoying for us to use.
+</p>
+<p>Google Drive and Dropbox are acceptable if you need a file host, and
+<a href="https://0x0.st/">0x0.st</a> is good for files under 256 MiB.
+</p>
+<p>Small, short samples are preferred if possible.
+</p>
+<a name="Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f">5.5 Will I receive spam if I send and/or subscribe to a mailing list?</a></h2>
+
+<p>Highly unlikely.
+</p>
+<ul>
+<li>
+The list of subscribed users is not public.
+
+</li><li>
+Email addresses in the archives are obfuscated.
+
+</li><li>
+Several unique test email accounts were utilized and none have yet
+received any spam.
+</li></ul>
+
+<p>However, you may see a spam in the mailing lists on rare occasions:
+</p>
+<ul>
+<li>
+Spam in the moderation queue may be accidentally approved due to human
+error.
+
+</li><li>
+There have been a few messages from subscribed users who had their own
+email addresses hacked and spam messages from (or appearing to be from)
+the hacked account were sent to their contacts (a mailing list being a
+contact in these cases).
+
+</li><li>
+If you are subscribed to the bug tracker mailing list (ffmpeg-trac) you
+may see the occasional spam as a false bug report, but we take measures
+to try to prevent this.
+</li></ul>
+
+<a name="How-do-I-filter-mailing-list-messages_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-filter-mailing-list-messages_003f">5.6 How do I filter mailing list messages?</a></h2>
+
+<p>Use the <em>List-Id</em>. For example, the ffmpeg-user mailing list is
+<tt>ffmpeg-user.ffmpeg.org</tt>. You can view the List-Id in the raw message
+or headers.
+</p>
+<p>You can then filter the mailing list messages to their own folder.
+</p>
+<p><a name="How-do-I-disable-mail-delivery-without-unsubscribing_003f"></a>
+</p><a name="How-do-I-disable-mail-delivery-without-unsubscribing_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-How-do-I-disable-mail-delivery-without-unsubscribing_003f-1">5.7 How do I disable mail delivery without unsubscribing?</a></h2>
+
+<p>Sometimes you may want to temporarily stop receiving all mailing list
+messages. This &quot;vacation mode&quot; is simple to do:
+</p>
+<ol>
+<li>
+Go to the <a href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user mailing list info page</a>
+
+</li><li>
+Enter your email address in the box at very bottom of the page and click the
+<em>Unsubscribe or edit options</em> box.
+
+</li><li>
+Enter your password and click the <em>Log in</em> button.
+
+</li><li>
+Look for the <em>Mail delivery</em> option. Here you can disable/enable mail
+delivery. If you check <em>Set globally</em> it will apply your choice to all
+other FFmpeg mailing lists you are subscribed to.
+</li></ol>
+
+<p>Alternatively, from your subscribed address, send a message to <a href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a>
+with the subject <em>set delivery off</em>. To re-enable mail delivery send a
+message to <a href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a> with the subject
+<em>set delivery on</em>.
+</p>
+<p><a name="Why-is-the-mailing-list-munging-my-address_003f"></a>
+</p><a name="Why-is-the-mailing-list-munging-my-address_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Why-is-the-mailing-list-munging-my-address_003f-1">5.8 Why is the mailing list munging my address?</a></h2>
+
+<p>This is due to subscribers that use an email service with a DMARC reject policy
+which adds difficulties to mailing list operators.
+</p>
+<p>The mailing list must re-write (munge) the <em>From:</em> header for such users;
+otherwise their email service will reject and bounce the message resulting in
+automatic unsubscribing from the mailing list.
+</p>
+<p>When sending a message these users will see <em>via &lt;mailing list name&gt;</em>
+added to their name and the <em>From:</em> address munged to the address of
+the particular mailing list.
+</p>
+<p>If you want to avoid this then please use a different email service.
+</p>
+<p>Note that ffmpeg-devel does not apply any munging as it causes issues with
+patch authorship. As a result users with an email service with a DMARC reject
+policy may be automatically unsubscribed due to rejected and bounced messages.
+</p>
+<a name="Rules-and-Etiquette"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-Rules-and-Etiquette">6 Rules and Etiquette</a></h1>
+
+<a name="What-are-the-rules-and-the-proper-etiquette_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-What-are-the-rules-and-the-proper-etiquette_003f">6.1 What are the rules and the proper etiquette?</a></h2>
+
+<p>There may seem to be many things to remember, but we want to help and
+following these guidelines will allow you to get answers more quickly
+and help avoid getting ignored.
+</p>
+<ul>
+<li>
+Always show your actual, unscripted <code>ffmpeg</code> command and the
+complete, uncut console output from your command.
+
+</li><li>
+Use the most simple and minimal command that still shows the issue you
+are encountering.
+
+</li><li>
+Provide all necessary information so others can attempt to duplicate
+your issue. This includes the actual command, complete uncut console
+output, and any inputs that are required to duplicate the issue.
+
+</li><li>
+Use the latest <code>ffmpeg</code> build you can get. See the <a href="https://ffmpeg.org/download.html">FFmpeg Download</a>
+page for links to recent builds for Linux, macOS, and Windows. Or
+compile from the current git master branch.
+
+</li><li>
+Avoid <a href="https://en.wikipedia.org/wiki/Posting_style#Top-posting">top-posting</a>.
+Also see <a href="#What-is-top_002dposting_003f">What is top-posting?</a>
+
+</li><li>
+Avoid hijacking threads. Thread hijacking is replying to a message and
+changing the subject line to something unrelated to the original thread.
+Most email clients will still show the renamed message under the
+original thread. This can be confusing and these types of messages are
+often ignored.
+
+</li><li>
+Do not send screenshots. Copy and paste console text instead of making
+screenshots of the text.
+
+</li><li>
+Avoid sending email disclaimers and legalese if possible as this is a
+public list.
+
+</li><li>
+Avoid using the <code>-loglevel debug</code>, <code>-loglevel quiet</code>, and
+<code>-hide_banner</code> options unless requested to do so.
+
+</li><li>
+If you attach files avoid compressing small files. Uncompressed is
+preferred.
+
+</li><li>
+Please do not send HTML-only messages. The mailing list will ignore the
+HTML component of your message. Most mail clients will automatically
+include a text component: this is what the mailing list will use.
+
+</li><li>
+Configuring your mail client to break lines after 70 or so characters is
+recommended.
+
+</li><li>
+Avoid sending the same message to multiple mailing lists.
+
+</li><li>
+Please follow our <a href="https://ffmpeg.org/developer.html#Code-of-conduct">Code of Conduct</a>.
+</li></ul>
+
+<a name="Help"></a>
+<h1 class="chapter"><a href="mailing-list-faq.html#toc-Help">7 Help</a></h1>
+
+<a name="Why-am-I-not-receiving-any-messages_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Why-am-I-not-receiving-any-messages_003f">7.1 Why am I not receiving any messages?</a></h2>
+
+<p>Some email providers have blacklists or spam filters that block or mark
+the mailing list messages as false positives. Unfortunately, the user is
+often not aware of this and is often out of their control.
+</p>
+<p>When possible we attempt to notify the provider to be removed from the
+blacklists or filters.
+</p>
+<a name="Why-are-my-sent-messages-not-showing-up_003f"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Why-are-my-sent-messages-not-showing-up_003f">7.2 Why are my sent messages not showing up?</a></h2>
+
+<p>Excluding <a href="#Why-is-my-message-awaiting-moderator-approval_003f">messages that are held in the moderation queue</a>
+there are a few other reasons why your messages may fail to appear:
+</p>
+<ul>
+<li>
+HTML-only messages are ignored by the mailing lists. Most mail clients
+automatically include a text component alongside HTML email: this is what
+the mailing list will use. If it does not then consider your client to be
+broken, because sending a text component along with the HTML component to
+form a multi-part message is recommended by email standards.
+
+</li><li>
+Check your spam folder.
+</li></ul>
+
+<p><a name="Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f"></a>
+</p><a name="Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1">7.3 Why do I keep getting unsubscribed from ffmpeg-devel?</a></h2>
+
+<p>Users with an email service that has a DMARC reject or quarantine policy may be
+automatically unsubscribed from the ffmpeg-devel mailing list due to the mailing
+list messages being continuously rejected and bounced back.
+</p>
+<p>Consider using a different email service.
+</p>
+<p><a name="Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f"></a>
+</p><a name="Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1"></a>
+<h2 class="section"><a href="mailing-list-faq.html#toc-Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1">7.4 Who do I contact if I have a problem with the mailing list?</a></h2>
+
+<p>Send a message to <a href="mailto:ffmpeg-user-owner@ffmpeg.org">ffmpeg-user-owner@ffmpeg.org</a>.
+</p>
+    </div>
+  </body>
+</html>
+

+ 219 - 0
ffmpeg/doc/nut.html

@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="NUT: ">
+<meta name="keywords" content="FFmpeg documentation : NUT: ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">NUT</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Description" href="#Description">1 Description</a></li>
+  <li><a name="toc-Modes" href="#Modes">2 Modes</a>
+  <ul class="no-bullet">
+    <li><a name="toc-BROADCAST" href="#BROADCAST">2.1 BROADCAST</a></li>
+    <li><a name="toc-PIPE" href="#PIPE">2.2 PIPE</a></li>
+  </ul></li>
+  <li><a name="toc-Container_002dspecific-codec-tags" href="#Container_002dspecific-codec-tags">3 Container-specific codec tags</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Generic-raw-YUVA-formats" href="#Generic-raw-YUVA-formats">3.1 Generic raw YUVA formats</a></li>
+    <li><a name="toc-Raw-Audio" href="#Raw-Audio">3.2 Raw Audio</a></li>
+    <li><a name="toc-Subtitles" href="#Subtitles">3.3 Subtitles</a></li>
+    <li><a name="toc-Raw-Data" href="#Raw-Data">3.4 Raw Data</a></li>
+    <li><a name="toc-Codecs" href="#Codecs">3.5 Codecs</a></li>
+  </ul>
+</li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Description"></a>
+<h1 class="chapter"><a href="nut.html#toc-Description">1 Description</a></h1>
+<p>NUT is a low overhead generic container format. It stores audio, video,
+subtitle and user-defined streams in a simple, yet efficient, way.
+</p>
+<p>It was created by a group of FFmpeg and MPlayer developers in 2003
+and was finalized in 2008.
+</p>
+<p>The official nut specification is at svn://svn.mplayerhq.hu/nut
+In case of any differences between this text and the official specification,
+the official specification shall prevail.
+</p>
+<a name="Modes"></a>
+<h1 class="chapter"><a href="nut.html#toc-Modes">2 Modes</a></h1>
+<p>NUT has some variants signaled by using the flags field in its main header.
+</p>
+<table>
+<tr><td width="40%">BROADCAST</td><td width="40%">Extend the syncpoint to report the sender wallclock</td></tr>
+<tr><td width="40%">PIPE</td><td width="40%">Omit completely the syncpoint</td></tr>
+</table>
+
+<a name="BROADCAST"></a>
+<h2 class="section"><a href="nut.html#toc-BROADCAST">2.1 BROADCAST</a></h2>
+
+<p>The BROADCAST variant provides a secondary time reference to facilitate
+detecting endpoint latency and network delays.
+It assumes all the endpoint clocks are synchronized.
+To be used in real-time scenarios.
+</p>
+<a name="PIPE"></a>
+<h2 class="section"><a href="nut.html#toc-PIPE">2.2 PIPE</a></h2>
+
+<p>The PIPE variant assumes NUT is used as non-seekable intermediate container,
+by not using syncpoint removes unneeded overhead and reduces the overall
+memory usage.
+</p>
+<a name="Container_002dspecific-codec-tags"></a>
+<h1 class="chapter"><a href="nut.html#toc-Container_002dspecific-codec-tags">3 Container-specific codec tags</a></h1>
+
+<a name="Generic-raw-YUVA-formats"></a>
+<h2 class="section"><a href="nut.html#toc-Generic-raw-YUVA-formats">3.1 Generic raw YUVA formats</a></h2>
+
+<p>Since many exotic planar YUVA pixel formats are not considered by
+the AVI/QuickTime FourCC lists, the following scheme is adopted for
+representing them.
+</p>
+<p>The first two bytes can contain the values:
+Y1 = only Y
+Y2 = Y+A
+Y3 = YUV
+Y4 = YUVA
+</p>
+<p>The third byte represents the width and height chroma subsampling
+values for the UV planes, that is the amount to shift the luma
+width/height right to find the chroma width/height.
+</p>
+<p>The fourth byte is the number of bits used (8, 16, ...).
+</p>
+<p>If the order of bytes is inverted, that means that each component has
+to be read big-endian.
+</p>
+<a name="Raw-Audio"></a>
+<h2 class="section"><a href="nut.html#toc-Raw-Audio">3.2 Raw Audio</a></h2>
+
+<table>
+<tr><td width="40%">ALAW</td><td width="40%">A-LAW</td></tr>
+<tr><td width="40%">ULAW</td><td width="40%">MU-LAW</td></tr>
+<tr><td width="40%">P&lt;type&gt;&lt;interleaving&gt;&lt;bits&gt;</td><td width="40%">little-endian PCM</td></tr>
+<tr><td width="40%">&lt;bits&gt;&lt;interleaving&gt;&lt;type&gt;P</td><td width="40%">big-endian PCM</td></tr>
+</table>
+
+<p>&lt;type&gt; is S for signed integer, U for unsigned integer, F for IEEE float
+&lt;interleaving&gt; is D for default, P is for planar.
+&lt;bits&gt; is 8/16/24/32
+</p>
+<div class="example">
+<pre class="example">PFD[32]   would for example be signed 32 bit little-endian IEEE float
+</pre></div>
+
+<a name="Subtitles"></a>
+<h2 class="section"><a href="nut.html#toc-Subtitles">3.3 Subtitles</a></h2>
+
+<table>
+<tr><td width="40%">UTF8</td><td width="40%">Raw UTF-8</td></tr>
+<tr><td width="40%">SSA[0]</td><td width="40%">SubStation Alpha</td></tr>
+<tr><td width="40%">DVDS</td><td width="40%">DVD subtitles</td></tr>
+<tr><td width="40%">DVBS</td><td width="40%">DVB subtitles</td></tr>
+</table>
+
+<a name="Raw-Data"></a>
+<h2 class="section"><a href="nut.html#toc-Raw-Data">3.4 Raw Data</a></h2>
+
+<table>
+<tr><td width="40%">UTF8</td><td width="40%">Raw UTF-8</td></tr>
+</table>
+
+<a name="Codecs"></a>
+<h2 class="section"><a href="nut.html#toc-Codecs">3.5 Codecs</a></h2>
+
+<table>
+<tr><td width="40%">3IV1</td><td width="40%">non-compliant MPEG-4 generated by old 3ivx</td></tr>
+<tr><td width="40%">ASV1</td><td width="40%">Asus Video</td></tr>
+<tr><td width="40%">ASV2</td><td width="40%">Asus Video 2</td></tr>
+<tr><td width="40%">CVID</td><td width="40%">Cinepak</td></tr>
+<tr><td width="40%">CYUV</td><td width="40%">Creative YUV</td></tr>
+<tr><td width="40%">DIVX</td><td width="40%">non-compliant MPEG-4 generated by old DivX</td></tr>
+<tr><td width="40%">DUCK</td><td width="40%">Truemotion 1</td></tr>
+<tr><td width="40%">FFV1</td><td width="40%">FFmpeg video 1</td></tr>
+<tr><td width="40%">FFVH</td><td width="40%">FFmpeg Huffyuv</td></tr>
+<tr><td width="40%">H261</td><td width="40%">ITU H.261</td></tr>
+<tr><td width="40%">H262</td><td width="40%">ITU H.262</td></tr>
+<tr><td width="40%">H263</td><td width="40%">ITU H.263</td></tr>
+<tr><td width="40%">H264</td><td width="40%">ITU H.264</td></tr>
+<tr><td width="40%">HFYU</td><td width="40%">Huffyuv</td></tr>
+<tr><td width="40%">I263</td><td width="40%">Intel H.263</td></tr>
+<tr><td width="40%">IV31</td><td width="40%">Indeo 3.1</td></tr>
+<tr><td width="40%">IV32</td><td width="40%">Indeo 3.2</td></tr>
+<tr><td width="40%">IV50</td><td width="40%">Indeo 5.0</td></tr>
+<tr><td width="40%">LJPG</td><td width="40%">ITU JPEG (lossless)</td></tr>
+<tr><td width="40%">MJLS</td><td width="40%">ITU JPEG-LS</td></tr>
+<tr><td width="40%">MJPG</td><td width="40%">ITU JPEG</td></tr>
+<tr><td width="40%">MPG4</td><td width="40%">MS MPEG-4v1 (not ISO MPEG-4)</td></tr>
+<tr><td width="40%">MP42</td><td width="40%">MS MPEG-4v2</td></tr>
+<tr><td width="40%">MP43</td><td width="40%">MS MPEG-4v3</td></tr>
+<tr><td width="40%">MP4V</td><td width="40%">ISO MPEG-4 Part 2 Video (from old encoders)</td></tr>
+<tr><td width="40%">mpg1</td><td width="40%">ISO MPEG-1 Video</td></tr>
+<tr><td width="40%">mpg2</td><td width="40%">ISO MPEG-2 Video</td></tr>
+<tr><td width="40%">MRLE</td><td width="40%">MS RLE</td></tr>
+<tr><td width="40%">MSVC</td><td width="40%">MS Video 1</td></tr>
+<tr><td width="40%">RT21</td><td width="40%">Indeo 2.1</td></tr>
+<tr><td width="40%">RV10</td><td width="40%">RealVideo 1.0</td></tr>
+<tr><td width="40%">RV20</td><td width="40%">RealVideo 2.0</td></tr>
+<tr><td width="40%">RV30</td><td width="40%">RealVideo 3.0</td></tr>
+<tr><td width="40%">RV40</td><td width="40%">RealVideo 4.0</td></tr>
+<tr><td width="40%">SNOW</td><td width="40%">FFmpeg Snow</td></tr>
+<tr><td width="40%">SVQ1</td><td width="40%">Sorenson Video 1</td></tr>
+<tr><td width="40%">SVQ3</td><td width="40%">Sorenson Video 3</td></tr>
+<tr><td width="40%">theo</td><td width="40%">Xiph Theora</td></tr>
+<tr><td width="40%">TM20</td><td width="40%">Truemotion 2.0</td></tr>
+<tr><td width="40%">UMP4</td><td width="40%">non-compliant MPEG-4 generated by UB Video MPEG-4</td></tr>
+<tr><td width="40%">VCR1</td><td width="40%">ATI VCR1</td></tr>
+<tr><td width="40%">VP30</td><td width="40%">VP 3.0</td></tr>
+<tr><td width="40%">VP31</td><td width="40%">VP 3.1</td></tr>
+<tr><td width="40%">VP50</td><td width="40%">VP 5.0</td></tr>
+<tr><td width="40%">VP60</td><td width="40%">VP 6.0</td></tr>
+<tr><td width="40%">VP61</td><td width="40%">VP 6.1</td></tr>
+<tr><td width="40%">VP62</td><td width="40%">VP 6.2</td></tr>
+<tr><td width="40%">VP70</td><td width="40%">VP 7.0</td></tr>
+<tr><td width="40%">WMV1</td><td width="40%">MS WMV7</td></tr>
+<tr><td width="40%">WMV2</td><td width="40%">MS WMV8</td></tr>
+<tr><td width="40%">WMV3</td><td width="40%">MS WMV9</td></tr>
+<tr><td width="40%">WV1F</td><td width="40%">non-compliant MPEG-4 generated by ?</td></tr>
+<tr><td width="40%">WVC1</td><td width="40%">VC-1</td></tr>
+<tr><td width="40%">XVID</td><td width="40%">non-compliant MPEG-4 generated by old Xvid</td></tr>
+<tr><td width="40%">XVIX</td><td width="40%">non-compliant MPEG-4 generated by old Xvid with interlacing bug</td></tr>
+</table>
+
+    </div>
+  </body>
+</html>
+

+ 406 - 0
ffmpeg/doc/platform.html

@@ -0,0 +1,406 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>FFmpeg documentation</title>
+    <link rel="stylesheet" href="bootstrap.min.css" />
+    <link rel="stylesheet" href="style.min.css" />
+
+<meta name="description" content="Platform Specific Information: ">
+<meta name="keywords" content="FFmpeg documentation : Platform Specific Information: ">
+<meta name="Generator" content="texi2html 5.0">
+<!-- Created on June 8, 2020 by texi2html 5.0 -->
+<!--
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  </head>
+  <body>
+    <div class="container">
+
+<h1 class="titlefont">Platform Specific Information</h1>
+<hr>
+<a name="SEC_Top"></a>
+
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Unix_002dlike" href="#Unix_002dlike">1 Unix-like</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Advanced-linking-configuration" href="#Advanced-linking-configuration">1.1 Advanced linking configuration</a></li>
+    <li><a name="toc-BSD" href="#BSD">1.2 BSD</a></li>
+    <li><a name="toc-_0028Open_0029Solaris" href="#g_t_0028Open_0029Solaris">1.3 (Open)Solaris</a></li>
+    <li><a name="toc-Darwin-_0028Mac-OS-X_002c-iPhone_0029" href="#Darwin-_0028Mac-OS-X_002c-iPhone_0029">1.4 Darwin (Mac OS X, iPhone)</a></li>
+  </ul></li>
+  <li><a name="toc-DOS" href="#DOS">2 DOS</a></li>
+  <li><a name="toc-OS_002f2" href="#OS_002f2">3 OS/2</a></li>
+  <li><a name="toc-Windows" href="#Windows">4 Windows</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Native-Windows-compilation-using-MinGW-or-MinGW_002dw64" href="#Native-Windows-compilation-using-MinGW-or-MinGW_002dw64">4.1 Native Windows compilation using MinGW or MinGW-w64</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Native-Windows-compilation-using-MSYS2" href="#Native-Windows-compilation-using-MSYS2">4.1.1 Native Windows compilation using MSYS2</a></li>
+    </ul></li>
+    <li><a name="toc-Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows" href="#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows">4.2 Microsoft Visual C++ or Intel C++ Compiler for Windows</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b" href="#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b">4.2.1 Linking to FFmpeg with Microsoft Visual C++</a></li>
+    </ul></li>
+    <li><a name="toc-Cross-compilation-for-Windows-with-Linux-1" href="#Cross-compilation-for-Windows-with-Linux-1">4.3 Cross compilation for Windows with Linux</a></li>
+    <li><a name="toc-Compilation-under-Cygwin" href="#Compilation-under-Cygwin">4.4 Compilation under Cygwin</a></li>
+    <li><a name="toc-Crosscompilation-for-Windows-under-Cygwin" href="#Crosscompilation-for-Windows-under-Cygwin">4.5 Crosscompilation for Windows under Cygwin</a></li>
+  </ul>
+</li>
+</ul>
+</div>
+
+
+<hr size="6">
+<a name="Unix_002dlike"></a>
+<h1 class="chapter"><a href="platform.html#toc-Unix_002dlike">1 Unix-like</a></h1>
+
+<p>Some parts of FFmpeg cannot be built with version 2.15 of the GNU
+assembler which is still provided by a few AMD64 distributions. To
+make sure your compiler really uses the required version of gas
+after a binutils upgrade, run:
+</p>
+<div class="example">
+<pre class="example">$(gcc -print-prog-name=as) --version
+</pre></div>
+
+<p>If not, then you should install a different compiler that has no
+hard-coded path to gas. In the worst case pass <code>--disable-asm</code>
+to configure.
+</p>
+<a name="Advanced-linking-configuration"></a>
+<h2 class="section"><a href="platform.html#toc-Advanced-linking-configuration">1.1 Advanced linking configuration</a></h2>
+
+<p>If you compiled FFmpeg libraries statically and you want to use them to
+build your own shared library, you may need to force PIC support (with
+<code>--enable-pic</code> during FFmpeg configure) and add the following option
+to your project LDFLAGS:
+</p>
+<div class="example">
+<pre class="example">-Wl,-Bsymbolic
+</pre></div>
+
+<p>If your target platform requires position independent binaries, you should
+pass the correct linking flag (e.g. <code>-pie</code>) to <code>--extra-ldexeflags</code>.
+</p>
+<a name="BSD"></a>
+<h2 class="section"><a href="platform.html#toc-BSD">1.2 BSD</a></h2>
+
+<p>BSD make will not build FFmpeg, you need to install and use GNU Make
+(<code>gmake</code>).
+</p>
+<a name="g_t_0028Open_0029Solaris"></a>
+<h2 class="section"><a href="platform.html#toc-_0028Open_0029Solaris">1.3 (Open)Solaris</a></h2>
+
+<p>GNU Make is required to build FFmpeg, so you have to invoke (<code>gmake</code>),
+standard Solaris Make will not work. When building with a non-c99 front-end
+(gcc, generic suncc) add either <code>--extra-libs=/usr/lib/values-xpg6.o</code>
+or <code>--extra-libs=/usr/lib/64/values-xpg6.o</code> to the configure options
+since the libc is not c99-compliant by default. The probes performed by
+configure may raise an exception leading to the death of configure itself
+due to a bug in the system shell. Simply invoke a different shell such as
+bash directly to work around this:
+</p>
+<div class="example">
+<pre class="example">bash ./configure
+</pre></div>
+
+<p><a name="Darwin"></a>
+</p><a name="Darwin-_0028Mac-OS-X_002c-iPhone_0029"></a>
+<h2 class="section"><a href="platform.html#toc-Darwin-_0028Mac-OS-X_002c-iPhone_0029">1.4 Darwin (Mac OS X, iPhone)</a></h2>
+
+<p>The toolchain provided with Xcode is sufficient to build the basic
+unaccelerated code.
+</p>
+<p>Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
+<a href="https://github.com/FFmpeg/gas-preprocessor">https://github.com/FFmpeg/gas-preprocessor</a> or
+<a href="https://github.com/yuvi/gas-preprocessor">https://github.com/yuvi/gas-preprocessor</a>(currently outdated) to build the optimized
+assembly functions. Put the Perl script somewhere
+in your PATH, FFmpeg&rsquo;s configure will pick it up automatically.
+</p>
+<p>Mac OS X on amd64 and x86 requires <code>nasm</code> to build most of the
+optimized assembly functions. <a href="http://www.finkproject.org/">Fink</a>,
+<a href="https://wiki.gentoo.org/wiki/Project:Prefix">Gentoo Prefix</a>,
+<a href="https://mxcl.github.com/homebrew/">Homebrew</a>
+or <a href="http://www.macports.org">MacPorts</a> can easily provide it.
+</p>
+
+<a name="DOS"></a>
+<h1 class="chapter"><a href="platform.html#toc-DOS">2 DOS</a></h1>
+
+<p>Using a cross-compiler is preferred for various reasons.
+<a href="http://www.delorie.com/howto/djgpp/linux-x-djgpp.html">http://www.delorie.com/howto/djgpp/linux-x-djgpp.html</a>
+</p>
+
+<a name="OS_002f2"></a>
+<h1 class="chapter"><a href="platform.html#toc-OS_002f2">3 OS/2</a></h1>
+
+<p>For information about compiling FFmpeg on OS/2 see
+<a href="http://www.edm2.com/index.php/FFmpeg">http://www.edm2.com/index.php/FFmpeg</a>.
+</p>
+
+<a name="Windows"></a>
+<h1 class="chapter"><a href="platform.html#toc-Windows">4 Windows</a></h1>
+
+<p>To get help and instructions for building FFmpeg under Windows, check out
+the FFmpeg Windows Help Forum at <a href="http://ffmpeg.zeranoe.com/forum/">http://ffmpeg.zeranoe.com/forum/</a>.
+</p>
+<a name="Native-Windows-compilation-using-MinGW-or-MinGW_002dw64"></a>
+<h2 class="section"><a href="platform.html#toc-Native-Windows-compilation-using-MinGW-or-MinGW_002dw64">4.1 Native Windows compilation using MinGW or MinGW-w64</a></h2>
+
+<p>FFmpeg can be built to run natively on Windows using the MinGW-w64
+toolchain. Install the latest versions of MSYS2 and MinGW-w64 from
+<a href="http://msys2.github.io/">http://msys2.github.io/</a> and/or <a href="http://mingw-w64.sourceforge.net/">http://mingw-w64.sourceforge.net/</a>.
+You can find detailed installation instructions in the download section and
+the FAQ.
+</p>
+<p>Notes:
+</p>
+<ul>
+<li> Building for the MSYS environment is discouraged, MSYS2 provides a full
+MinGW-w64 environment through &lsquo;<tt>mingw64_shell.bat</tt>&rsquo; or
+&lsquo;<tt>mingw32_shell.bat</tt>&rsquo; that should be used instead of the environment
+provided by &lsquo;<tt>msys2_shell.bat</tt>&rsquo;.
+
+</li><li> Building using MSYS2 can be sped up by disabling implicit rules in the
+Makefile by calling <code>make -r</code> instead of plain <code>make</code>. This
+speed up is close to non-existent for normal one-off builds and is only
+noticeable when running make for a second time (for example during
+<code>make install</code>).
+
+</li><li> In order to compile FFplay, you must have the MinGW development library
+of <a href="http://www.libsdl.org/">SDL</a> and <code>pkg-config</code> installed.
+
+</li><li> By using <code>./configure --enable-shared</code> when configuring FFmpeg,
+you can build the FFmpeg libraries (e.g. libavutil, libavcodec,
+libavformat) as DLLs.
+
+</li></ul>
+
+<a name="Native-Windows-compilation-using-MSYS2"></a>
+<h3 class="subsection"><a href="platform.html#toc-Native-Windows-compilation-using-MSYS2">4.1.1 Native Windows compilation using MSYS2</a></h3>
+
+<p>The MSYS2 MinGW-w64 environment provides ready to use toolchains and dependencies
+through <code>pacman</code>.
+</p>
+<p>Make sure to use &lsquo;<tt>mingw64_shell.bat</tt>&rsquo; or &lsquo;<tt>mingw32_shell.bat</tt>&rsquo; to have
+the correct MinGW-w64 environment. The default install provides shortcuts to
+them under <code>MinGW-w64 Win64 Shell</code> and <code>MinGW-w64 Win32 Shell</code>.
+</p>
+<div class="example">
+<pre class="example"># normal msys2 packages
+pacman -S make pkgconf diffutils
+
+# mingw-w64 packages and toolchains
+pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
+</pre></div>
+
+<p>To target 32 bits replace <code>x86_64</code> with <code>i686</code> in the command above.
+</p>
+<a name="Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows"></a>
+<h2 class="section"><a href="platform.html#toc-Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows">4.2 Microsoft Visual C++ or Intel C++ Compiler for Windows</a></h2>
+
+<p>FFmpeg can be built with MSVC 2013 or later.
+</p>
+<p>You will need the following prerequisites:
+</p>
+<ul>
+<li> <a href="http://msys2.github.io/">MSYS2</a>
+</li><li> <a href="http://www.nasm.us/">NASM</a>
+(Also available via MSYS2&rsquo;s package manager.)
+</li></ul>
+
+<p>To set up a proper environment in MSYS2, you need to run <code>msys_shell.bat</code> from
+the Visual Studio or Intel Compiler command prompt.
+</p>
+<p>Place <code>yasm.exe</code> somewhere in your <code>PATH</code>.
+</p>
+<p>Next, make sure any other headers and libs you want to use, such as zlib, are
+located in a spot that the compiler can see. Do so by modifying the <code>LIB</code>
+and <code>INCLUDE</code> environment variables to include the <strong>Windows-style</strong>
+paths to these directories. Alternatively, you can try to use the
+<code>--extra-cflags</code>/<code>--extra-ldflags</code> configure options.
+</p>
+<p>Finally, run:
+</p>
+<div class="example">
+<pre class="example">For MSVC:
+./configure --toolchain=msvc
+
+For ICL:
+./configure --toolchain=icl
+
+make
+make install
+</pre></div>
+
+<p>If you wish to compile shared libraries, add <code>--enable-shared</code> to your
+configure options. Note that due to the way MSVC and ICL handle DLL imports and
+exports, you cannot compile static and shared libraries at the same time, and
+enabling shared libraries will automatically disable the static ones.
+</p>
+<p>Notes:
+</p>
+<ul>
+<li> If you wish to build with zlib support, you will have to grab a compatible
+zlib binary from somewhere, with an MSVC import lib, or if you wish to link
+statically, you can follow the instructions below to build a compatible
+<code>zlib.lib</code> with MSVC. Regardless of which method you use, you must still
+follow step 3, or compilation will fail.
+<ol>
+<li> Grab the <a href="http://zlib.net/">zlib sources</a>.
+</li><li> Edit <code>win32/Makefile.msc</code> so that it uses -MT instead of -MD, since
+this is how FFmpeg is built as well.
+</li><li> Edit <code>zconf.h</code> and remove its inclusion of <code>unistd.h</code>. This gets
+erroneously included when building FFmpeg.
+</li><li> Run <code>nmake -f win32/Makefile.msc</code>.
+</li><li> Move <code>zlib.lib</code>, <code>zconf.h</code>, and <code>zlib.h</code> to somewhere MSVC
+can see.
+</li></ol>
+
+</li><li> FFmpeg has been tested with the following on i686 and x86_64:
+<ul>
+<li> Visual Studio 2013 Pro and Express
+</li><li> Intel Composer XE 2013
+</li><li> Intel Composer XE 2013 SP1
+</li></ul>
+<p>Anything else is not officially supported.
+</p>
+</li></ul>
+
+<a name="Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b"></a>
+<h3 class="subsection"><a href="platform.html#toc-Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b">4.2.1 Linking to FFmpeg with Microsoft Visual C++</a></h3>
+
+<p>If you plan to link with MSVC-built static libraries, you will need
+to make sure you have <code>Runtime Library</code> set to
+<code>Multi-threaded (/MT)</code> in your project&rsquo;s settings.
+</p>
+<p>You will need to define <code>inline</code> to something MSVC understands:
+</p><div class="example">
+<pre class="example">#define inline __inline
+</pre></div>
+
+<p>Also note, that as stated in <strong>Microsoft Visual C++</strong>, you will need
+an MSVC-compatible <a href="http://code.google.com/p/msinttypes/">inttypes.h</a>.
+</p>
+<p>If you plan on using import libraries created by dlltool, you must
+set <code>References</code> to <code>No (/OPT:NOREF)</code> under the linker optimization
+settings, otherwise the resulting binaries will fail during runtime.
+This is not required when using import libraries generated by <code>lib.exe</code>.
+This issue is reported upstream at
+<a href="http://sourceware.org/bugzilla/show_bug.cgi?id=12633">http://sourceware.org/bugzilla/show_bug.cgi?id=12633</a>.
+</p>
+<p>To create import libraries that work with the <code>/OPT:REF</code> option
+(which is enabled by default in Release mode), follow these steps:
+</p>
+<ol>
+<li> Open the <em>Visual Studio Command Prompt</em>.
+
+<p>Alternatively, in a normal command line prompt, call &lsquo;<tt>vcvars32.bat</tt>&rsquo;
+which sets up the environment variables for the Visual C++ tools
+(the standard location for this file is something like
+&lsquo;<tt>C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat</tt>&rsquo;).
+</p>
+</li><li> Enter the &lsquo;<tt>bin</tt>&rsquo; directory where the created LIB and DLL files
+are stored.
+
+</li><li> Generate new import libraries with <code>lib.exe</code>:
+
+<div class="example">
+<pre class="example">lib /machine:i386 /def:..\lib\foo-version.def  /out:foo.lib
+</pre></div>
+
+<p>Replace <code>foo-version</code> and <code>foo</code> with the respective library names.
+</p>
+</li></ol>
+
+<p><a name="Cross-compilation-for-Windows-with-Linux"></a>
+</p><a name="Cross-compilation-for-Windows-with-Linux-1"></a>
+<h2 class="section"><a href="platform.html#toc-Cross-compilation-for-Windows-with-Linux-1">4.3 Cross compilation for Windows with Linux</a></h2>
+
+<p>You must use the MinGW cross compilation tools available at
+<a href="http://www.mingw.org/">http://www.mingw.org/</a>.
+</p>
+<p>Then configure FFmpeg with the following options:
+</p><div class="example">
+<pre class="example">./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-
+</pre></div>
+<p>(you can change the cross-prefix according to the prefix chosen for the
+MinGW tools).
+</p>
+<p>Then you can easily test FFmpeg with <a href="http://www.winehq.com/">Wine</a>.
+</p>
+<a name="Compilation-under-Cygwin"></a>
+<h2 class="section"><a href="platform.html#toc-Compilation-under-Cygwin">4.4 Compilation under Cygwin</a></h2>
+
+<p>Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack
+llrint() in its C library.
+</p>
+<p>Install your Cygwin with all the &quot;Base&quot; packages, plus the
+following &quot;Devel&quot; ones:
+</p><div class="example">
+<pre class="example">binutils, gcc4-core, make, git, mingw-runtime, texinfo
+</pre></div>
+
+<p>In order to run FATE you will also need the following &quot;Utils&quot; packages:
+</p><div class="example">
+<pre class="example">diffutils
+</pre></div>
+
+<p>If you want to build FFmpeg with additional libraries, download Cygwin
+&quot;Devel&quot; packages for Ogg and Vorbis from any Cygwin packages repository:
+</p><div class="example">
+<pre class="example">libogg-devel, libvorbis-devel
+</pre></div>
+
+<p>These library packages are only available from
+<a href="http://sourceware.org/cygwinports/">Cygwin Ports</a>:
+</p>
+<div class="example">
+<pre class="example">yasm, libSDL-devel, libgsm-devel, libmp3lame-devel,
+speex-devel, libtheora-devel, libxvidcore-devel
+</pre></div>
+
+<p>The recommendation for x264 is to build it from source, as it evolves too
+quickly for Cygwin Ports to be up to date.
+</p>
+<a name="Crosscompilation-for-Windows-under-Cygwin"></a>
+<h2 class="section"><a href="platform.html#toc-Crosscompilation-for-Windows-under-Cygwin">4.5 Crosscompilation for Windows under Cygwin</a></h2>
+
+<p>With Cygwin you can create Windows binaries that do not need the cygwin1.dll.
+</p>
+<p>Just install your Cygwin as explained before, plus these additional
+&quot;Devel&quot; packages:
+</p><div class="example">
+<pre class="example">gcc-mingw-core, mingw-runtime, mingw-zlib
+</pre></div>
+
+<p>and add some special flags to your configure invocation.
+</p>
+<p>For a static build run
+</p><div class="example">
+<pre class="example">./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
+</pre></div>
+
+<p>and for a build with shared libraries
+</p><div class="example">
+<pre class="example">./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
+</pre></div>
+
+    </div>
+  </body>
+</html>
+

File diff suppressed because it is too large
+ 23 - 0
ffmpeg/doc/style.min.css


+ 394 - 0
ffmpeg/presets/ffprobe.xsd

@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://www.ffmpeg.org/schema/ffprobe"
+    xmlns:ffprobe="http://www.ffmpeg.org/schema/ffprobe">
+
+    <xsd:element name="ffprobe" type="ffprobe:ffprobeType"/>
+
+    <xsd:complexType name="ffprobeType">
+        <xsd:sequence>
+            <xsd:element name="program_version"  type="ffprobe:programVersionType"  minOccurs="0" maxOccurs="1" />
+            <xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="pixel_formats"    type="ffprobe:pixelFormatsType"    minOccurs="0" maxOccurs="1" />
+            <xsd:element name="packets"  type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="frames"   type="ffprobe:framesType"  minOccurs="0" maxOccurs="1" />
+            <xsd:element name="packets_and_frames" type="ffprobe:packetsAndFramesType" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="streams"  type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="format"   type="ffprobe:formatType"  minOccurs="0" maxOccurs="1" />
+            <xsd:element name="error"    type="ffprobe:errorType"   minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="packetsType">
+        <xsd:sequence>
+            <xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="framesType">
+        <xsd:sequence>
+            <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/>
+                <xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:choice>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="packetsAndFramesType">
+        <xsd:sequence>
+            <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/>
+                <xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/>
+                <xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:choice>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="packetType">
+      <xsd:sequence>
+        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="side_data_list" type="ffprobe:packetSideDataListType"   minOccurs="0" maxOccurs="1" />
+      </xsd:sequence>
+
+      <xsd:attribute name="codec_type"    type="xsd:string" use="required" />
+      <xsd:attribute name="stream_index"  type="xsd:int" use="required" />
+      <xsd:attribute name="pts"           type="xsd:long"  />
+      <xsd:attribute name="pts_time"      type="xsd:float" />
+      <xsd:attribute name="dts"           type="xsd:long"  />
+      <xsd:attribute name="dts_time"      type="xsd:float" />
+      <xsd:attribute name="duration"      type="xsd:long"  />
+      <xsd:attribute name="duration_time" type="xsd:float" />
+      <xsd:attribute name="convergence_duration"      type="xsd:long"  />
+      <xsd:attribute name="convergence_duration_time" type="xsd:float" />
+      <xsd:attribute name="size"          type="xsd:long" use="required" />
+      <xsd:attribute name="pos"           type="xsd:long"  />
+      <xsd:attribute name="flags"         type="xsd:string" use="required" />
+      <xsd:attribute name="data"          type="xsd:string" />
+      <xsd:attribute name="data_hash"     type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="packetSideDataListType">
+        <xsd:sequence>
+            <xsd:element name="side_data" type="ffprobe:packetSideDataType" minOccurs="1" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+    <xsd:complexType name="packetSideDataType">
+        <xsd:attribute name="side_data_type"              type="xsd:string"/>
+        <xsd:attribute name="side_data_size"              type="xsd:int"   />
+    </xsd:complexType>
+
+    <xsd:complexType name="frameType">
+      <xsd:sequence>
+            <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
+            <xsd:element name="logs" type="ffprobe:logsType" minOccurs="0" maxOccurs="1"/>
+            <xsd:element name="side_data_list" type="ffprobe:frameSideDataListType"   minOccurs="0" maxOccurs="1" />
+      </xsd:sequence>
+
+      <xsd:attribute name="media_type"    type="xsd:string" use="required"/>
+      <xsd:attribute name="stream_index"  type="xsd:int"  />
+      <xsd:attribute name="key_frame"     type="xsd:int"    use="required"/>
+      <xsd:attribute name="pts"           type="xsd:long" />
+      <xsd:attribute name="pts_time"      type="xsd:float"/>
+      <xsd:attribute name="pkt_pts"       type="xsd:long" />
+      <xsd:attribute name="pkt_pts_time"  type="xsd:float"/>
+      <xsd:attribute name="pkt_dts"       type="xsd:long" />
+      <xsd:attribute name="pkt_dts_time"  type="xsd:float"/>
+      <xsd:attribute name="best_effort_timestamp"      type="xsd:long" />
+      <xsd:attribute name="best_effort_timestamp_time" type="xsd:float" />
+      <xsd:attribute name="pkt_duration"  type="xsd:long" />
+      <xsd:attribute name="pkt_duration_time" type="xsd:float"/>
+      <xsd:attribute name="pkt_pos"       type="xsd:long" />
+      <xsd:attribute name="pkt_size"      type="xsd:int" />
+
+      <!-- audio attributes -->
+      <xsd:attribute name="sample_fmt"             type="xsd:string"/>
+      <xsd:attribute name="nb_samples"             type="xsd:long"  />
+      <xsd:attribute name="channels"               type="xsd:int"   />
+      <xsd:attribute name="channel_layout"         type="xsd:string"/>
+
+      <!-- video attributes -->
+      <xsd:attribute name="width"                  type="xsd:long"  />
+      <xsd:attribute name="height"                 type="xsd:long"  />
+      <xsd:attribute name="pix_fmt"                type="xsd:string"/>
+      <xsd:attribute name="sample_aspect_ratio"    type="xsd:string"/>
+      <xsd:attribute name="pict_type"              type="xsd:string"/>
+      <xsd:attribute name="coded_picture_number"   type="xsd:long"  />
+      <xsd:attribute name="display_picture_number" type="xsd:long"  />
+      <xsd:attribute name="interlaced_frame"       type="xsd:int"   />
+      <xsd:attribute name="top_field_first"        type="xsd:int"   />
+      <xsd:attribute name="repeat_pict"            type="xsd:int"   />
+      <xsd:attribute name="color_range"            type="xsd:string"/>
+      <xsd:attribute name="color_space"            type="xsd:string"/>
+      <xsd:attribute name="color_primaries"        type="xsd:string"/>
+      <xsd:attribute name="color_transfer"         type="xsd:string"/>
+      <xsd:attribute name="chroma_location"        type="xsd:string"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="logsType">
+        <xsd:sequence>
+            <xsd:element name="log" type="ffprobe:logType" minOccurs="1" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+    <xsd:complexType name="logType">
+        <xsd:attribute name="context"                     type="xsd:string"/>
+        <xsd:attribute name="level"                       type="xsd:int"   />
+        <xsd:attribute name="category"                    type="xsd:int"   />
+        <xsd:attribute name="parent_context"              type="xsd:string"/>
+        <xsd:attribute name="parent_category"             type="xsd:int"   />
+        <xsd:attribute name="message"                     type="xsd:string"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="frameSideDataListType">
+        <xsd:sequence>
+            <xsd:element name="side_data" type="ffprobe:frameSideDataType" minOccurs="1" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+    <xsd:complexType name="frameSideDataType">
+        <xsd:sequence>
+            <xsd:element name="timecodes" type="ffprobe:frameSideDataTimecodeList" minOccurs="0" maxOccurs="1"/>
+        </xsd:sequence>
+
+        <xsd:attribute name="side_data_type"              type="xsd:string"/>
+        <xsd:attribute name="side_data_size"              type="xsd:int"   />
+        <xsd:attribute name="timecode"                    type="xsd:string"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="frameSideDataTimecodeList">
+        <xsd:sequence>
+            <xsd:element name="timecode" type="ffprobe:frameSideDataTimecodeType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="frameSideDataTimecodeType">
+        <xsd:attribute name="value"              type="xsd:string"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="subtitleType">
+      <xsd:attribute name="media_type"         type="xsd:string" fixed="subtitle" use="required"/>
+      <xsd:attribute name="pts"                type="xsd:long" />
+      <xsd:attribute name="pts_time"           type="xsd:float"/>
+      <xsd:attribute name="format"             type="xsd:int"  />
+      <xsd:attribute name="start_display_time" type="xsd:int"  />
+      <xsd:attribute name="end_display_time"   type="xsd:int"  />
+      <xsd:attribute name="num_rects"          type="xsd:int"  />
+    </xsd:complexType>
+
+    <xsd:complexType name="streamsType">
+        <xsd:sequence>
+            <xsd:element name="stream" type="ffprobe:streamType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="programsType">
+        <xsd:sequence>
+            <xsd:element name="program" type="ffprobe:programType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="streamDispositionType">
+      <xsd:attribute name="default"          type="xsd:int" use="required" />
+      <xsd:attribute name="dub"              type="xsd:int" use="required" />
+      <xsd:attribute name="original"         type="xsd:int" use="required" />
+      <xsd:attribute name="comment"          type="xsd:int" use="required" />
+      <xsd:attribute name="lyrics"           type="xsd:int" use="required" />
+      <xsd:attribute name="karaoke"          type="xsd:int" use="required" />
+      <xsd:attribute name="forced"           type="xsd:int" use="required" />
+      <xsd:attribute name="hearing_impaired" type="xsd:int" use="required" />
+      <xsd:attribute name="visual_impaired"  type="xsd:int" use="required" />
+      <xsd:attribute name="clean_effects"    type="xsd:int" use="required" />
+      <xsd:attribute name="attached_pic"     type="xsd:int" use="required" />
+      <xsd:attribute name="timed_thumbnails" type="xsd:int" use="required" />
+    </xsd:complexType>
+
+    <xsd:complexType name="streamType">
+      <xsd:sequence>
+        <xsd:element name="disposition" type="ffprobe:streamDispositionType" minOccurs="0" maxOccurs="1"/>
+        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="side_data_list" type="ffprobe:packetSideDataListType"   minOccurs="0" maxOccurs="1" />
+      </xsd:sequence>
+
+      <xsd:attribute name="index"            type="xsd:int" use="required"/>
+      <xsd:attribute name="codec_name"       type="xsd:string" />
+      <xsd:attribute name="codec_long_name"  type="xsd:string" />
+      <xsd:attribute name="profile"          type="xsd:string" />
+      <xsd:attribute name="codec_type"       type="xsd:string" />
+      <xsd:attribute name="codec_time_base"  type="xsd:string" use="required"/>
+      <xsd:attribute name="codec_tag"        type="xsd:string" use="required"/>
+      <xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/>
+      <xsd:attribute name="extradata"        type="xsd:string" />
+      <xsd:attribute name="extradata_hash"   type="xsd:string" />
+
+      <!-- video attributes -->
+      <xsd:attribute name="width"                type="xsd:int"/>
+      <xsd:attribute name="height"               type="xsd:int"/>
+      <xsd:attribute name="coded_width"          type="xsd:int"/>
+      <xsd:attribute name="coded_height"         type="xsd:int"/>
+      <xsd:attribute name="closed_captions"      type="xsd:boolean"/>
+      <xsd:attribute name="has_b_frames"         type="xsd:int"/>
+      <xsd:attribute name="sample_aspect_ratio"  type="xsd:string"/>
+      <xsd:attribute name="display_aspect_ratio" type="xsd:string"/>
+      <xsd:attribute name="pix_fmt"              type="xsd:string"/>
+      <xsd:attribute name="level"                type="xsd:int"/>
+      <xsd:attribute name="color_range"          type="xsd:string"/>
+      <xsd:attribute name="color_space"          type="xsd:string"/>
+      <xsd:attribute name="color_transfer"       type="xsd:string"/>
+      <xsd:attribute name="color_primaries"      type="xsd:string"/>
+      <xsd:attribute name="chroma_location"      type="xsd:string"/>
+      <xsd:attribute name="field_order"          type="xsd:string"/>
+      <xsd:attribute name="timecode"             type="xsd:string"/>
+      <xsd:attribute name="refs"                 type="xsd:int"/>
+
+      <!-- audio attributes -->
+      <xsd:attribute name="sample_fmt"       type="xsd:string"/>
+      <xsd:attribute name="sample_rate"      type="xsd:int"/>
+      <xsd:attribute name="channels"         type="xsd:int"/>
+      <xsd:attribute name="channel_layout"   type="xsd:string"/>
+      <xsd:attribute name="bits_per_sample"  type="xsd:int"/>
+
+      <xsd:attribute name="id"               type="xsd:string"/>
+      <xsd:attribute name="r_frame_rate"     type="xsd:string" use="required"/>
+      <xsd:attribute name="avg_frame_rate"   type="xsd:string" use="required"/>
+      <xsd:attribute name="time_base"        type="xsd:string" use="required"/>
+      <xsd:attribute name="start_pts"        type="xsd:long"/>
+      <xsd:attribute name="start_time"       type="xsd:float"/>
+      <xsd:attribute name="duration_ts"      type="xsd:long"/>
+      <xsd:attribute name="duration"         type="xsd:float"/>
+      <xsd:attribute name="bit_rate"         type="xsd:int"/>
+      <xsd:attribute name="max_bit_rate"     type="xsd:int"/>
+      <xsd:attribute name="bits_per_raw_sample" type="xsd:int"/>
+      <xsd:attribute name="nb_frames"        type="xsd:int"/>
+      <xsd:attribute name="nb_read_frames"   type="xsd:int"/>
+      <xsd:attribute name="nb_read_packets"  type="xsd:int"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="programType">
+      <xsd:sequence>
+        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1"/>
+      </xsd:sequence>
+
+      <xsd:attribute name="program_id"           type="xsd:int"    use="required"/>
+      <xsd:attribute name="program_num"          type="xsd:int"    use="required"/>
+      <xsd:attribute name="nb_streams"           type="xsd:int"    use="required"/>
+      <xsd:attribute name="start_time"           type="xsd:float"/>
+      <xsd:attribute name="start_pts"            type="xsd:long"/>
+      <xsd:attribute name="end_time"             type="xsd:float"/>
+      <xsd:attribute name="end_pts"              type="xsd:long"/>
+      <xsd:attribute name="pmt_pid"              type="xsd:int"    use="required"/>
+      <xsd:attribute name="pcr_pid"              type="xsd:int"    use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="formatType">
+      <xsd:sequence>
+        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+
+      <xsd:attribute name="filename"         type="xsd:string" use="required"/>
+      <xsd:attribute name="nb_streams"       type="xsd:int"    use="required"/>
+      <xsd:attribute name="nb_programs"      type="xsd:int"    use="required"/>
+      <xsd:attribute name="format_name"      type="xsd:string" use="required"/>
+      <xsd:attribute name="format_long_name" type="xsd:string"/>
+      <xsd:attribute name="start_time"       type="xsd:float"/>
+      <xsd:attribute name="duration"         type="xsd:float"/>
+      <xsd:attribute name="size"             type="xsd:long"/>
+      <xsd:attribute name="bit_rate"         type="xsd:long"/>
+      <xsd:attribute name="probe_score"      type="xsd:int"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="tagType">
+      <xsd:attribute name="key"   type="xsd:string" use="required"/>
+      <xsd:attribute name="value" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="errorType">
+      <xsd:attribute name="code"   type="xsd:int"    use="required"/>
+      <xsd:attribute name="string" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="programVersionType">
+      <xsd:attribute name="version"          type="xsd:string" use="required"/>
+      <xsd:attribute name="copyright"        type="xsd:string" use="required"/>
+      <xsd:attribute name="build_date"       type="xsd:string"/>
+      <xsd:attribute name="build_time"       type="xsd:string"/>
+      <xsd:attribute name="compiler_ident"   type="xsd:string" use="required"/>
+      <xsd:attribute name="configuration"    type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="chaptersType">
+      <xsd:sequence>
+        <xsd:element name="chapter" type="ffprobe:chapterType" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="chapterType">
+      <xsd:sequence>
+        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+
+      <xsd:attribute name="id"         type="xsd:int" use="required"/>
+      <xsd:attribute name="time_base"  type="xsd:string" use="required"/>
+      <xsd:attribute name="start"      type="xsd:int" use="required"/>
+      <xsd:attribute name="start_time" type="xsd:float"/>
+      <xsd:attribute name="end"        type="xsd:int" use="required"/>
+      <xsd:attribute name="end_time"   type="xsd:float" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="libraryVersionType">
+      <xsd:attribute name="name"        type="xsd:string" use="required"/>
+      <xsd:attribute name="major"       type="xsd:int"    use="required"/>
+      <xsd:attribute name="minor"       type="xsd:int"    use="required"/>
+      <xsd:attribute name="micro"       type="xsd:int"    use="required"/>
+      <xsd:attribute name="version"     type="xsd:int"    use="required"/>
+      <xsd:attribute name="ident"       type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="libraryVersionsType">
+        <xsd:sequence>
+          <xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="pixelFormatFlagsType">
+      <xsd:attribute name="big_endian" type="xsd:int" use="required"/>
+      <xsd:attribute name="palette"    type="xsd:int" use="required"/>
+      <xsd:attribute name="bitstream"  type="xsd:int" use="required"/>
+      <xsd:attribute name="hwaccel"    type="xsd:int" use="required"/>
+      <xsd:attribute name="planar"     type="xsd:int" use="required"/>
+      <xsd:attribute name="rgb"        type="xsd:int" use="required"/>
+      <xsd:attribute name="pseudopal"  type="xsd:int" use="required"/>
+      <xsd:attribute name="alpha"      type="xsd:int" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="pixelFormatComponentType">
+      <xsd:attribute name="index"      type="xsd:int" use="required"/>
+      <xsd:attribute name="bit_depth"  type="xsd:int" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="pixelFormatComponentsType">
+      <xsd:sequence>
+        <xsd:element name="component" type="ffprobe:pixelFormatComponentType" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="pixelFormatType">
+      <xsd:sequence>
+        <xsd:element name="flags" type="ffprobe:pixelFormatFlagsType" minOccurs="0" maxOccurs="1"/>
+        <xsd:element name="components" type="ffprobe:pixelFormatComponentsType" minOccurs="0" maxOccurs="1"/>
+      </xsd:sequence>
+
+      <xsd:attribute name="name"                type="xsd:string" use="required"/>
+      <xsd:attribute name="nb_components"       type="xsd:int"    use="required"/>
+      <xsd:attribute name="log2_chroma_w"       type="xsd:int"/>
+      <xsd:attribute name="log2_chroma_h"       type="xsd:int"/>
+      <xsd:attribute name="bits_per_pixel"      type="xsd:int"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="pixelFormatsType">
+      <xsd:sequence>
+        <xsd:element name="pixel_format" type="ffprobe:pixelFormatType" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+    </xsd:complexType>
+</xsd:schema>

+ 19 - 0
ffmpeg/presets/libvpx-1080p.ffpreset

@@ -0,0 +1,19 @@
+vcodec=libvpx
+
+g=120
+lag-in-frames=16
+deadline=good
+cpu-used=0
+vprofile=1
+qmax=51
+qmin=11
+slices=4
+b=2M
+
+#ignored unless using -pass 2
+maxrate=24M
+minrate=100k
+auto-alt-ref=1
+arnr-maxframes=7
+arnr-strength=5
+arnr-type=centered

+ 19 - 0
ffmpeg/presets/libvpx-1080p50_60.ffpreset

@@ -0,0 +1,19 @@
+vcodec=libvpx
+
+g=120
+lag-in-frames=25
+deadline=good
+cpu-used=0
+vprofile=1
+qmax=51
+qmin=11
+slices=4
+b=2M
+
+#ignored unless using -pass 2
+maxrate=24M
+minrate=100k
+auto-alt-ref=1
+arnr-maxframes=7
+arnr-strength=5
+arnr-type=centered

+ 18 - 0
ffmpeg/presets/libvpx-360p.ffpreset

@@ -0,0 +1,18 @@
+vcodec=libvpx
+
+g=120
+lag-in-frames=16
+deadline=good
+cpu-used=0
+vprofile=0
+qmax=63
+qmin=0
+b=768k
+
+#ignored unless using -pass 2
+maxrate=1.5M
+minrate=40k
+auto-alt-ref=1
+arnr-maxframes=7
+arnr-strength=5
+arnr-type=centered

+ 19 - 0
ffmpeg/presets/libvpx-720p.ffpreset

@@ -0,0 +1,19 @@
+vcodec=libvpx
+
+g=120
+lag-in-frames=16
+deadline=good
+cpu-used=0
+vprofile=0
+qmax=51
+qmin=11
+slices=4
+b=2M
+
+#ignored unless using -pass 2
+maxrate=24M
+minrate=100k
+auto-alt-ref=1
+arnr-maxframes=7
+arnr-strength=5
+arnr-type=centered

+ 19 - 0
ffmpeg/presets/libvpx-720p50_60.ffpreset

@@ -0,0 +1,19 @@
+vcodec=libvpx
+
+g=120
+lag-in-frames=25
+deadline=good
+cpu-used=0
+vprofile=0
+qmax=51
+qmin=11
+slices=4
+b=2M
+
+#ignored unless using -pass 2
+maxrate=24M
+minrate=100k
+auto-alt-ref=1
+arnr-maxframes=7
+arnr-strength=5
+arnr-type=centered

+ 22 - 0
nginx-rtmp-win32-master/LICENSE

@@ -0,0 +1,22 @@
+Copyright (c) 2012-2014, Roman Arutyunyan
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 53 - 0
nginx-rtmp-win32-master/README.md

@@ -0,0 +1,53 @@
+nginx-rtmp-win32
+================
+
+* Nginx: 1.13.12  
+* Nginx-Rtmp-Module: 1.2.1  
+* openssl-1.0.2o
+* pcre-8.42
+* zlib-1.2.11
+
+# configure arguments
+```
+nginx version: nginx/1.13.12
+built by cl 16.00.30319.01 for 80x86
+built with OpenSSL 1.0.2o  27 Mar 2018
+TLS SNI support enabled
+configure arguments: --with-cc=cl --builddir=objs --prefix= --conf-path=conf/ngi
+nx.conf --pid-path=logs/nginx.pid --http-log-path=logs/access.log --error-log-pa
+th=logs/error.log --sbin-path=nginx.exe --http-client-body-temp-path=temp/client
+_body_temp --http-proxy-temp-path=temp/proxy_temp --http-fastcgi-temp-path=temp/
+fastcgi_temp --http-scgi-temp-path=temp/scgi_temp --http-uwsgi-temp-path=temp/uw
+sgi_temp --with-cc-opt=-DFD_SETSIZE=1024 --with-openssl=objs/lib/openssl-1.0.2o
+--with-openssl-opt=no-asm --with-pcre=objs/lib/pcre-8.42 --with-zlib=objs/lib/zl
+ib-1.2.11 --with-select_module --with-http_v2_module --with-http_realip_module -
+-with-http_addition_module --with-http_sub_module --with-http_dav_module --with-
+http_stub_status_module --with-http_flv_module --with-http_mp4_module --with-htt
+p_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module -
+-with-http_random_index_module --with-http_secure_link_module --with-http_slice_
+module --with-mail --with-stream --with-stream_realip_module --with-http_ssl_mod
+ule --with-mail_ssl_module --with-stream_ssl_module --add-module=objs/lib/nginx-
+rtmp-module
+```
+
+# 使用方法
+双击nginx.exe
+# 简要说明
+conf/nginx.conf 为配置文件实例  
+RTMP监听 1935 端口,启用live 和hls 两个application  
+HTTP监听 8080 端口,
+* :8080/stat 查看stream状态  
+* :8080/index.html 为一个直播播放与直播发布测试器
+* :8080/vod.html 为一个支持RTMP和HLS点播的测试器
+
+# 注意
+不支持exec
+
+# 直播测试工具 
+内置了一个方便测试的pc端推流于播放的工具
+![img](https://github.com/NodeMedia/NodeMediaDevClient/raw/master/QQ20160310-0.png)
+源码在此:https://github.com/NodeMedia/NodeMediaDevClient
+
+# 另一个选择,支持HTTP-FLV
+基于Node.js实现,高性能,原生跨平台,支持RTMP/HTTP-FLV/GOPcache
+https://github.com/illuspas/Node-Media-Server 

+ 83 - 0
nginx-rtmp-win32-master/conf/mime.types

@@ -0,0 +1,83 @@
+
+types {
+    text/html                             html htm shtml;
+    text/css                              css;
+    text/xml                              xml;
+    image/gif                             gif;
+    image/jpeg                            jpeg jpg;
+    application/x-javascript              js;
+    application/atom+xml                  atom;
+    application/rss+xml                   rss;
+
+    text/mathml                           mml;
+    text/plain                            txt;
+    text/vnd.sun.j2me.app-descriptor      jad;
+    text/vnd.wap.wml                      wml;
+    text/x-component                      htc;
+
+    image/png                             png;
+    image/tiff                            tif tiff;
+    image/vnd.wap.wbmp                    wbmp;
+    image/x-icon                          ico;
+    image/x-jng                           jng;
+    image/x-ms-bmp                        bmp;
+    image/svg+xml                         svg svgz;
+    image/webp                            webp;
+
+    application/java-archive              jar war ear;
+    application/mac-binhex40              hqx;
+    application/msword                    doc;
+    application/pdf                       pdf;
+    application/postscript                ps eps ai;
+    application/rtf                       rtf;
+    application/vnd.ms-excel              xls;
+    application/vnd.ms-powerpoint         ppt;
+    application/vnd.wap.wmlc              wmlc;
+    application/vnd.google-earth.kml+xml  kml;
+    application/vnd.google-earth.kmz      kmz;
+    application/x-7z-compressed           7z;
+    application/x-cocoa                   cco;
+    application/x-java-archive-diff       jardiff;
+    application/x-java-jnlp-file          jnlp;
+    application/x-makeself                run;
+    application/x-perl                    pl pm;
+    application/x-pilot                   prc pdb;
+    application/x-rar-compressed          rar;
+    application/x-redhat-package-manager  rpm;
+    application/x-sea                     sea;
+    application/x-shockwave-flash         swf;
+    application/x-stuffit                 sit;
+    application/x-tcl                     tcl tk;
+    application/x-x509-ca-cert            der pem crt;
+    application/x-xpinstall               xpi;
+    application/xhtml+xml                 xhtml;
+    application/zip                       zip;
+
+    application/octet-stream              bin exe dll;
+    application/octet-stream              deb;
+    application/octet-stream              dmg;
+    application/octet-stream              eot;
+    application/octet-stream              iso img;
+    application/octet-stream              msi msp msm;
+
+    audio/midi                            mid midi kar;
+    audio/mpeg                            mp3;
+    audio/ogg                             ogg;
+    audio/x-m4a                           m4a;
+    audio/x-realaudio                     ra;
+
+    video/3gpp                            3gpp 3gp;
+    video/mp4                             mp4;
+    video/mpeg                            mpeg mpg;
+    video/quicktime                       mov;
+    video/webm                            webm;
+    video/x-flv                           flv;
+    video/x-m4v                           m4v;
+    video/x-mng                           mng;
+    video/x-ms-asf                        asx asf;
+    video/x-ms-wmv                        wmv;
+    video/x-msvideo                       avi;
+    video/mp2t                            ts;
+    application/vnd.apple.mpegurl         m3u8;  
+            
+}

+ 53 - 0
nginx-rtmp-win32-master/conf/nginx.conf

@@ -0,0 +1,53 @@
+worker_processes  1;
+
+error_log  logs/error.log debug;
+
+events {
+    worker_connections  1024;
+}
+
+rtmp {
+    server {
+        listen 1935;
+
+        application live {
+            live on;
+        }
+		
+        application hls {
+            live on;
+            hls on;  
+            hls_path temp/hls;  
+            hls_fragment 8s;  
+        }
+    }
+}
+
+http {
+    server {
+        listen      8080;
+		
+        location / {
+            root html;
+        }
+		
+        location /stat {
+            rtmp_stat all;
+            rtmp_stat_stylesheet stat.xsl;
+        }
+
+        location /stat.xsl {
+            root html;
+        }
+		
+        location /hls {  
+            #server hls fragments  
+            types{  
+                application/vnd.apple.mpegurl m3u8;  
+                video/mp2t ts;  
+            }  
+            alias temp/hls;  
+            expires -1;  
+        }  
+    }
+}

+ 21 - 0
nginx-rtmp-win32-master/html/50x.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Error</title>
+<style>
+    body {
+        width: 35em;
+        margin: 0 auto;
+        font-family: Tahoma, Verdana, Arial, sans-serif;
+    }
+</style>
+</head>
+<body>
+<h1>An error occurred.</h1>
+<p>Sorry, the page you are looking for is currently unavailable.<br/>
+Please try again later.</p>
+<p>If you are the system administrator of this resource then you should check
+the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
+<p><em>Faithfully yours, nginx.</em></p>
+</body>
+</html>

BIN
nginx-rtmp-win32-master/html/GrindPlayer.swf


BIN
nginx-rtmp-win32-master/html/Main.swf


+ 91 - 0
nginx-rtmp-win32-master/html/ParsedQueryString.js

@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * 
+ * ParsedQueryString version 1.0
+ * Copyright 2007, Jeff Mott <Mott.Jeff@gmail.com>. All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms with or without
+ * modification are permitted provided that the above copyright notice,
+ * this condition, and the following disclaimer are retained.
+ *
+ * THIS SOFTWARE IS PROVIDED AS IS, AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING BUT NOT
+ * LIMITED TO PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ ******************************************************************************/
+
+function ParsedQueryString() {
+    this._init();
+}
+
+ParsedQueryString.version = '1.0';
+
+ParsedQueryString.prototype =
+{
+    _init:
+        function ()
+        {
+            this._parameters = {};
+
+            if (location.search.length <= 1)
+                return;
+            var pairs = location.search.substr(1).split(/[&;]/);
+            for (var i = 0; i < pairs.length; i++)
+            {
+                var pair = pairs[i].split(/=/);
+                var name = this._decodeURL(pair[0]);
+                if (Boolean(pair[1]))
+                {
+                    var value = this._decodeURL(pair[1]);
+                    if (Boolean(this._parameters[name]))
+                        this._parameters[name].push(value);
+                    else
+                        this._parameters[name] = [value];
+                }
+            }
+        },
+
+    _decodeURL:
+        function (url) {
+            return decodeURIComponent(url.replace(/\+/g, " "));
+        },
+
+    param:
+        function (name)
+        {
+            if (Boolean(this._parameters[name]))
+                return this._parameters[name][0];
+            else
+                return "";
+        },
+
+    params:
+        function (name)
+        {
+            if (Boolean(name))
+            {
+                if (Boolean(this._parameters[name]))
+                {
+                    var values = [];
+                    for (var i = 0; i < this._parameters[name].length; i++)
+                        values.push(this._parameters[name][i]);
+                    return values;
+                }
+                else
+                    return [];
+            }
+            else
+            {
+                var names = [];
+                for (var name in this._parameters)
+                    names.push(name);
+                return names;
+            }
+        }
+};

+ 3 - 0
nginx-rtmp-win32-master/html/crossdomain.xml

@@ -0,0 +1,3 @@
+<cross-domain-policy>
+  <allow-access-from domain="*"/>
+</cross-domain-policy>

BIN
nginx-rtmp-win32-master/html/flashlsOSMF.swf


+ 111 - 0
nginx-rtmp-win32-master/html/index.html

@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0014)about:internet -->
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
+    <!-- 
+    Smart developers always View Source. 
+    
+    This application was built using Adobe Flex, an open source framework
+    for building rich Internet applications that get delivered via the
+    Flash Player or to desktops via Adobe AIR. 
+    
+    Learn more about Flex at http://flex.org 
+    // -->
+    <head>
+        <title>NodeMedia Rtmp 直播测试器</title>
+        <meta name="google" value="notranslate" />         
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and 
+             the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as 
+             the percentage of the height of its parent container, which has to be set explicitly.  Fix for
+             Firefox 3.6 focus border issues.  Initially, don't display flashContent div so it won't show 
+             if JavaScript disabled.
+        -->
+        <style type="text/css" media="screen"> 
+            html, body  { height:100%; }
+            body { margin:0; padding:0; overflow:auto; text-align:center; 
+                   background-color: #ffffff; }   
+            object:focus { outline:none; }
+            #flashContent { display:none; }
+        </style>
+        
+        <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
+        <!-- BEGIN Browser History required section -->
+        <link rel="stylesheet" type="text/css" href="history/history.css" />
+        <script type="text/javascript" src="history/history.js"></script>
+        <!-- END Browser History required section -->  
+            
+        <script type="text/javascript" src="swfobject.js"></script>
+        <script type="text/javascript">
+            // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. 
+            var swfVersionStr = "11.1.0";
+            // To use express install, set to playerProductInstall.swf, otherwise the empty string. 
+            var xiSwfUrlStr = "playerProductInstall.swf";
+            var flashvars = {};
+            var params = {};
+            params.quality = "high";
+            params.bgcolor = "#ffffff";
+            params.allowscriptaccess = "sameDomain";
+            params.allowfullscreen = "true";
+            var attributes = {};
+            attributes.id = "Main";
+            attributes.name = "Main";
+            attributes.align = "middle";
+            swfobject.embedSWF(
+                "Main.swf", "flashContent", 
+                "1300", "600", 
+                swfVersionStr, xiSwfUrlStr, 
+                flashvars, params, attributes);
+            // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object.
+            swfobject.createCSS("#flashContent", "display:block;text-align:left;");
+        </script>
+    </head>
+    <body>
+        <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough 
+             JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show
+             when JavaScript is disabled.
+        -->
+		<div>
+			<a href="/vod.html">RTMP 点播测试器</a> <a href="/stat" target="_blank">RTMP 流监控</a> <a href="http://www.nodemedia.cn/" target="_blank">获取Android & iOS RTMP 开发SDK</a>
+		</div>
+        <div id="flashContent">
+            <p>
+                To view this page ensure that Adobe Flash Player version 
+                11.1.0 or greater is installed. 
+            </p>
+            <script type="text/javascript"> 
+                var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); 
+                document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 
+                                + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 
+            </script> 
+        </div>
+        
+        <noscript>
+            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="Main">
+                <param name="movie" value="Main.swf" />
+                <param name="quality" value="high" />
+                <param name="bgcolor" value="#ffffff" />
+                <param name="allowScriptAccess" value="sameDomain" />
+                <param name="allowFullScreen" value="true" />
+                <!--[if !IE]>-->
+                <object type="application/x-shockwave-flash" data="Main.swf" width="100%" height="100%">
+                    <param name="quality" value="high" />
+                    <param name="bgcolor" value="#ffffff" />
+                    <param name="allowScriptAccess" value="sameDomain" />
+                    <param name="allowFullScreen" value="true" />
+                <!--<![endif]-->
+                <!--[if gte IE 6]>-->
+                    <p> 
+                        Either scripts and active content are not permitted to run or Adobe Flash Player version
+                        11.1.0 or greater is not installed.
+                    </p>
+                <!--<![endif]-->
+                    <a href="http://www.adobe.com/go/getflashplayer">
+                        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
+                    </a>
+                <!--[if !IE]>-->
+                </object>
+                <!--<![endif]-->
+            </object>
+        </noscript>     
+   </body>
+</html>

+ 355 - 0
nginx-rtmp-win32-master/html/stat.xsl

@@ -0,0 +1,355 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+
+<!--
+   Copyright (C) Roman Arutyunyan
+-->
+
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+
+<xsl:template match="/">
+    <html>
+        <head>
+            <title>RTMP statistics</title>
+        </head>
+        <body>
+            <xsl:apply-templates select="rtmp"/>
+            <hr/>
+            Generated by <a href='https://github.com/arut/nginx-rtmp-module'>
+            nginx-rtmp-module</a>&#160;<xsl:value-of select="/rtmp/nginx_rtmp_version"/>,
+            <a href="http://nginx.org">nginx</a>&#160;<xsl:value-of select="/rtmp/nginx_version"/>,
+            pid <xsl:value-of select="/rtmp/pid"/>,
+            built <xsl:value-of select="/rtmp/built"/>&#160;<xsl:value-of select="/rtmp/compiler"/>
+        </body>
+    </html>
+</xsl:template>
+
+<xsl:template match="rtmp">
+    <table cellspacing="1" cellpadding="5">
+        <tr bgcolor="#999999">
+            <th>RTMP</th>
+            <th>#clients</th>
+            <th colspan="4">Video</th>
+            <th colspan="4">Audio</th>
+            <th>In bytes</th>
+            <th>Out bytes</th>
+            <th>In bits/s</th>
+            <th>Out bits/s</th>
+            <th>State</th>
+            <th>Time</th>
+        </tr>
+        <tr>
+            <td colspan="2">Accepted: <xsl:value-of select="naccepted"/></td>
+            <th bgcolor="#999999">codec</th>
+            <th bgcolor="#999999">bits/s</th>
+            <th bgcolor="#999999">size</th>
+            <th bgcolor="#999999">fps</th>
+            <th bgcolor="#999999">codec</th>
+            <th bgcolor="#999999">bits/s</th>
+            <th bgcolor="#999999">freq</th>
+            <th bgcolor="#999999">chan</th>
+            <td>
+                <xsl:call-template name="showsize">
+                    <xsl:with-param name="size" select="bytes_in"/>
+                </xsl:call-template>
+            </td>
+            <td>
+                <xsl:call-template name="showsize">
+                    <xsl:with-param name="size" select="bytes_out"/>
+                </xsl:call-template>
+            </td>
+            <td>
+                <xsl:call-template name="showsize">
+                    <xsl:with-param name="size" select="bw_in"/>
+                    <xsl:with-param name="bits" select="1"/>
+                    <xsl:with-param name="persec" select="1"/>
+                </xsl:call-template>
+            </td>
+            <td>
+                <xsl:call-template name="showsize">
+                    <xsl:with-param name="size" select="bw_out"/>
+                    <xsl:with-param name="bits" select="1"/>
+                    <xsl:with-param name="persec" select="1"/>
+                </xsl:call-template>
+            </td>
+            <td/>
+            <td>
+                <xsl:call-template name="showtime">
+                    <xsl:with-param name="time" select="/rtmp/uptime * 1000"/>
+                </xsl:call-template>
+            </td>
+        </tr>
+        <xsl:apply-templates select="server"/>
+    </table>
+</xsl:template>
+
+<xsl:template match="server">
+    <xsl:apply-templates select="application"/>
+</xsl:template>
+
+<xsl:template match="application">
+    <tr bgcolor="#999999">
+        <td>
+            <b><xsl:value-of select="name"/></b>
+        </td>
+    </tr>
+    <xsl:apply-templates select="live"/>
+    <xsl:apply-templates select="play"/>
+</xsl:template>
+
+<xsl:template match="live">
+    <tr bgcolor="#aaaaaa">
+        <td>
+            <i>live streams</i>
+        </td>
+        <td align="middle">
+            <xsl:value-of select="nclients"/>
+        </td>
+    </tr>
+    <xsl:apply-templates select="stream"/>
+</xsl:template>
+
+<xsl:template match="play">
+    <tr bgcolor="#aaaaaa">
+        <td>
+            <i>vod streams</i>
+        </td>
+        <td align="middle">
+            <xsl:value-of select="nclients"/>
+        </td>
+    </tr>
+    <xsl:apply-templates select="stream"/>
+</xsl:template>
+
+<xsl:template match="stream">
+    <tr valign="top">
+        <xsl:attribute name="bgcolor">
+            <xsl:choose>
+                <xsl:when test="active">#cccccc</xsl:when>
+                <xsl:otherwise>#dddddd</xsl:otherwise>
+            </xsl:choose>
+        </xsl:attribute>
+        <td>
+            <a href="">
+                <xsl:attribute name="onclick">
+                    var d=document.getElementById('<xsl:value-of select="../../name"/>-<xsl:value-of select="name"/>');
+                    d.style.display=d.style.display=='none'?'':'none';
+                    return false
+                </xsl:attribute>
+                <xsl:value-of select="name"/>
+                <xsl:if test="string-length(name) = 0">
+                    [EMPTY]
+                </xsl:if>
+            </a>
+        </td>
+        <td align="middle"> <xsl:value-of select="nclients"/> </td>
+        <td>
+            <xsl:value-of select="meta/video/codec"/>&#160;<xsl:value-of select="meta/video/profile"/>&#160;<xsl:value-of select="meta/video/level"/>
+        </td>
+        <td>
+            <xsl:call-template name="showsize">
+                <xsl:with-param name="size" select="bw_video"/>
+                <xsl:with-param name="bits" select="1"/>
+                <xsl:with-param name="persec" select="1"/>
+            </xsl:call-template>
+        </td>
+        <td>
+            <xsl:apply-templates select="meta/video/width"/>
+        </td>
+        <td>
+            <xsl:value-of select="meta/video/frame_rate"/>
+        </td>
+        <td>
+            <xsl:value-of select="meta/audio/codec"/>&#160;<xsl:value-of select="meta/audio/profile"/>
+        </td>
+        <td>
+            <xsl:call-template name="showsize">
+                <xsl:with-param name="size" select="bw_audio"/>
+                <xsl:with-param name="bits" select="1"/>
+                <xsl:with-param name="persec" select="1"/>
+            </xsl:call-template>
+        </td>
+        <td>
+            <xsl:apply-templates select="meta/audio/sample_rate"/>
+        </td>
+        <td>
+            <xsl:value-of select="meta/audio/channels"/>
+        </td>
+        <td>
+            <xsl:call-template name="showsize">
+               <xsl:with-param name="size" select="bytes_in"/>
+           </xsl:call-template>
+        </td>
+        <td>
+            <xsl:call-template name="showsize">
+                <xsl:with-param name="size" select="bytes_out"/>
+            </xsl:call-template>
+        </td>
+        <td>
+            <xsl:call-template name="showsize">
+                <xsl:with-param name="size" select="bw_in"/>
+                <xsl:with-param name="bits" select="1"/>
+                <xsl:with-param name="persec" select="1"/>
+            </xsl:call-template>
+        </td>
+        <td>
+            <xsl:call-template name="showsize">
+                <xsl:with-param name="size" select="bw_out"/>
+                <xsl:with-param name="bits" select="1"/>
+                <xsl:with-param name="persec" select="1"/>
+            </xsl:call-template>
+        </td>
+        <td><xsl:call-template name="streamstate"/></td>
+        <td>
+            <xsl:call-template name="showtime">
+               <xsl:with-param name="time" select="time"/>
+            </xsl:call-template>
+        </td>
+    </tr>
+    <tr style="display:none">
+        <xsl:attribute name="id">
+            <xsl:value-of select="../../name"/>-<xsl:value-of select="name"/>
+        </xsl:attribute>
+        <td colspan="16" ngcolor="#eeeeee">
+            <table cellspacing="1" cellpadding="5">
+                <tr>
+                    <th>Id</th>
+                    <th>State</th>
+                    <th>Address</th>
+                    <th>Flash version</th>
+                    <th>Page URL</th>
+                    <th>SWF URL</th>
+                    <th>Dropped</th>
+                    <th>Timestamp</th>
+                    <th>A-V</th>
+                    <th>Time</th>
+                </tr>
+                <xsl:apply-templates select="client"/>
+            </table>
+        </td>
+    </tr>
+</xsl:template>
+
+<xsl:template name="showtime">
+    <xsl:param name="time"/>
+
+    <xsl:if test="$time &gt; 0">
+        <xsl:variable name="sec">
+            <xsl:value-of select="floor($time div 1000)"/>
+        </xsl:variable>
+
+        <xsl:if test="$sec &gt;= 86400">
+            <xsl:value-of select="floor($sec div 86400)"/>d
+        </xsl:if>
+
+        <xsl:if test="$sec &gt;= 3600">
+            <xsl:value-of select="(floor($sec div 3600)) mod 24"/>h
+        </xsl:if>
+
+        <xsl:if test="$sec &gt;= 60">
+            <xsl:value-of select="(floor($sec div 60)) mod 60"/>m
+        </xsl:if>
+
+        <xsl:value-of select="$sec mod 60"/>s
+    </xsl:if>
+</xsl:template>
+
+<xsl:template name="showsize">
+    <xsl:param name="size"/>
+    <xsl:param name="bits" select="0" />
+    <xsl:param name="persec" select="0" />
+    <xsl:variable name="sizen">
+        <xsl:value-of select="floor($size div 1024)"/>
+    </xsl:variable>
+    <xsl:choose>
+        <xsl:when test="$sizen &gt;= 1073741824">
+            <xsl:value-of select="format-number($sizen div 1073741824,'#.###')"/> T</xsl:when>
+
+        <xsl:when test="$sizen &gt;= 1048576">
+            <xsl:value-of select="format-number($sizen div 1048576,'#.###')"/> G</xsl:when>
+
+        <xsl:when test="$sizen &gt;= 1024">
+            <xsl:value-of select="format-number($sizen div 1024,'#.##')"/> M</xsl:when>
+        <xsl:when test="$sizen &gt;= 0">
+            <xsl:value-of select="$sizen"/> K</xsl:when>
+    </xsl:choose>
+    <xsl:if test="string-length($size) &gt; 0">
+        <xsl:choose>
+            <xsl:when test="$bits = 1">b</xsl:when>
+            <xsl:otherwise>B</xsl:otherwise>
+        </xsl:choose>
+        <xsl:if test="$persec = 1">/s</xsl:if>
+    </xsl:if>
+</xsl:template>
+
+<xsl:template name="streamstate">
+    <xsl:choose>
+        <xsl:when test="active">active</xsl:when>
+        <xsl:otherwise>idle</xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="clientstate">
+    <xsl:choose>
+        <xsl:when test="publishing">publishing</xsl:when>
+        <xsl:otherwise>playing</xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="client">
+    <tr>
+        <xsl:attribute name="bgcolor">
+            <xsl:choose>
+                <xsl:when test="publishing">#cccccc</xsl:when>
+                <xsl:otherwise>#eeeeee</xsl:otherwise>
+            </xsl:choose>
+        </xsl:attribute>
+        <td><xsl:value-of select="id"/></td>
+        <td><xsl:call-template name="clientstate"/></td>
+        <td>
+            <a target="_blank">
+                <xsl:attribute name="href">
+                    http://apps.db.ripe.net/search/query.html&#63;searchtext=<xsl:value-of select="address"/>
+                </xsl:attribute>
+                <xsl:attribute name="title">whois</xsl:attribute>
+                <xsl:value-of select="address"/>
+            </a>
+        </td>
+        <td><xsl:value-of select="flashver"/></td>
+        <td>
+            <a target="_blank">
+                <xsl:attribute name="href">
+                    <xsl:value-of select="pageurl"/>
+                </xsl:attribute>
+                <xsl:value-of select="pageurl"/>
+            </a>
+        </td>
+        <td><xsl:value-of select="swfurl"/></td>
+        <td><xsl:value-of select="dropped"/></td>
+        <td><xsl:value-of select="timestamp"/></td>
+        <td><xsl:value-of select="avsync"/></td>
+        <td>
+            <xsl:call-template name="showtime">
+               <xsl:with-param name="time" select="time"/>
+            </xsl:call-template>
+        </td>
+    </tr>
+</xsl:template>
+
+<xsl:template match="publishing">
+    publishing
+</xsl:template>
+
+<xsl:template match="active">
+    active
+</xsl:template>
+
+<xsl:template match="width">
+    <xsl:value-of select="."/>x<xsl:value-of select="../height"/>
+</xsl:template>
+
+</xsl:stylesheet>

File diff suppressed because it is too large
+ 4 - 0
nginx-rtmp-win32-master/html/swfobject.js


+ 126 - 0
nginx-rtmp-win32-master/html/vod.html

@@ -0,0 +1,126 @@
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+    <head>
+        <title>Rtmp|HLS 点播测试器</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	</head>
+<body>
+<script type="text/javascript" src="/swfobject.js"></script>
+<script type="text/javascript" src="/ParsedQueryString.js"></script>
+<script type="text/javascript">
+var player = null;
+
+function loadStream(url) {
+  player.setMediaResourceURL(url);
+}
+
+function getlink(url) {
+  return "/vod.html?src=" + encodeURIComponent(url);
+}
+
+function jsbridge(playerId, event, data) {
+  if (player == null) {
+	player = document.getElementById(playerId);
+  }
+  switch(event) {
+	case "onJavaScriptBridgeCreated":
+	  listStreams(teststreams,"streamlist");
+	  break;
+	 case "timeChange":
+	 case "timeupdate":
+	 case "progress":
+	   break;
+	 default:
+	  console.log(event, data);
+	}
+}
+
+	// Collect query parameters in an object that we can
+	// forward to SWFObject:
+
+	var pqs = new ParsedQueryString();
+	var parameterNames = pqs.params(false);
+	var parameters = {
+	//    src: "rtmp://192.168.0.10/live/demo",
+		autoPlay: "true",
+		verbose: true,
+		controlBarAutoHide: "true",
+		controlBarPosition: "bottom",
+		poster: "images/poster.png",
+		javascriptCallbackFunction: "jsbridge",
+		plugin_hls: "/flashlsOSMF.swf",
+		hls_minbufferlength: -1,
+		hls_maxbufferlength: 30,
+		hls_lowbufferlength: 3,
+		hls_seekmode: "KEYFRAME",
+		hls_startfromlevel: -1,
+		hls_seekfromlevel: -1,
+		hls_live_flushurlcache: false,
+		hls_info: true,
+		hls_debug: false,
+		hls_debug2: false,
+		hls_warn: true,
+		hls_error: true,
+		hls_fragmentloadmaxretry : -1,
+		hls_manifestloadmaxretry : -1,
+		hls_capleveltostage : false,
+		hls_maxlevelcappingmode : "downscale"
+	};
+
+	for (var i = 0; i < parameterNames.length; i++) {
+		var parameterName = parameterNames[i];
+		parameters[parameterName] = pqs.param(parameterName) ||
+		parameters[parameterName];
+	}
+
+	var wmodeValue = "direct";
+	var wmodeOptions = ["direct", "opaque", "transparent", "window"];
+	if (parameters.hasOwnProperty("wmode"))
+	{
+		if (wmodeOptions.indexOf(parameters.wmode) >= 0)
+		{
+			wmodeValue = parameters.wmode;
+		}
+		delete parameters.wmode;
+	}
+
+	// Embed the player SWF:
+	swfobject.embedSWF(
+		"GrindPlayer.swf"
+		, "GrindPlayer"
+		, 640
+		, 480
+		, "10.1.0"
+		, "expressInstall.swf"
+		, parameters
+		, {
+			allowFullScreen: "true",
+			wmode: wmodeValue
+		}
+		, {
+			name: "GrindPlayer"
+		}
+	);
+
+</script>
+<h1>Nginx-Rtmp-Server</h1>
+<p>
+	<a href="/index.html">RTMP 直播测试器</a> <a href="/stat" target="_blank">RTMP 流监控</a> <a href="http://www.nodemedia.cn/" target="_blank">获取Android & iOS RTMP 开发SDK</a>
+</p>
+<div id="GrindPlayer">
+	<p>
+		Alternative content
+	</p>
+</div>
+<br>
+<input id="userInput" value="rtmp://192.168.0.10/live/demo" size="80"> <button onclick="userSubmit()">Play RTMP or HLS Stream</button><br>
+<p>
+<script type="text/javascript">
+function userSubmit() {
+  window.location = getlink(document.getElementById('userInput').value);
+}
+</script>
+    </body>
+</html>

BIN
nginx-rtmp-win32-master/nginx.exe


+ 1 - 0
nginx-rtmp-win32-master/stop.bat

@@ -0,0 +1 @@
+nginx.exe -s stop

+ 0 - 0
nginx-rtmp-win32-master/temp/temp.txt


+ 107 - 0
pom.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.4.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.example</groupId>
+    <artifactId>hkDemo</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>hkDemo</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.62</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.1.2</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>FFmpeg</groupId>
+            <artifactId>FFmpeg</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/hk/FFmpeg-1.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>examples</groupId>
+            <artifactId>examples</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/hk/examples.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>jna</groupId>
+            <artifactId>jna</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/hk/jna.jar</systemPath>
+        </dependency>
+
+    </dependencies>
+
+    <repositories>
+
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 70 - 0
postman/海康威视sdk测试.postman_collection.json

@@ -0,0 +1,70 @@
+{
+	"info": {
+		"_postman_id": "fe99cc4d-c8ad-41e2-a745-55a7cbb21140",
+		"name": "海康威视sdk测试",
+		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+	},
+	"item": [
+		{
+			"name": "实时浏览",
+			"request": {
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "http://localhost:8899/vedio",
+					"protocol": "http",
+					"host": [
+						"localhost"
+					],
+					"port": "8899",
+					"path": [
+						"vedio"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "控制云台",
+			"request": {
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "http://localhost:8899/dev/control/lightPwron",
+					"protocol": "http",
+					"host": [
+						"localhost"
+					],
+					"port": "8899",
+					"path": [
+						"dev",
+						"control",
+						"lightPwron"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "抓图",
+			"request": {
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "http://localhost:8899/dev/catchPic",
+					"protocol": "http",
+					"host": [
+						"localhost"
+					],
+					"port": "8899",
+					"path": [
+						"dev",
+						"catchPic"
+					]
+				}
+			},
+			"response": []
+		}
+	],
+	"protocolProfileBehavior": {}
+}

+ 22 - 0
src/main/java/com/example/demo/DemoApplication.java

@@ -0,0 +1,22 @@
+package com.example.demo;
+
+import com.example.demo.listen.LestenMSGCallBack;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+
+@EnableAsync
+@SpringBootApplication
+public class DemoApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(DemoApplication.class, args);
+	}
+
+
+}

+ 241 - 0
src/main/java/com/example/demo/entity/AjaxResult.java

@@ -0,0 +1,241 @@
+package com.example.demo.entity;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.HashMap;
+
+/**
+ * 操作消息提醒
+ *
+ * @author zmd
+ */
+public class AjaxResult extends HashMap<String, Object>
+{
+	private static final long serialVersionUID = 1L;
+
+	public static final String CODE_TAG = "code";
+
+	public static final String MSG_TAG = "msg";
+
+	public static final String DATA_TAG = "data";
+
+	/**
+	 * 状态类型
+	 */
+	public enum Type
+	{
+		/** 成功 */
+		SUCCESS(0),
+		/** 警告 */
+		WARN(301),
+		/** 错误 */
+		ERROR(500);
+		private final int value;
+
+		Type(int value)
+		{
+			this.value = value;
+		}
+
+		public int value()
+		{
+			return this.value;
+		}
+	}
+
+	/** 状态类型 */
+	private Type type;
+
+	/** 状态码 */
+	private int code;
+
+	/** 返回内容 */
+	private String msg;
+
+	/** 数据对象 */
+	private Object data;
+
+	/**
+	 * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
+	 */
+	public AjaxResult()
+	{
+	}
+
+	/**
+	 * 初始化一个新创建的 AjaxResult 对象
+	 *
+	 * @param type 状态类型
+	 * @param msg 返回内容
+	 */
+	public AjaxResult(Type type, String msg)
+	{
+		super.put(CODE_TAG, type.value);
+		super.put(MSG_TAG, msg);
+	}
+
+	/**
+	 * 初始化一个新创建的 AjaxResult 对象
+	 *
+	 * @param type 状态类型
+	 * @param msg 返回内容
+	 * @param data 数据对象
+	 */
+	public AjaxResult(Type type, String msg, Object data)
+	{
+		super.put(CODE_TAG, type.value);
+		super.put(MSG_TAG, msg);
+		if (data!=null)
+		{
+			super.put(DATA_TAG, data);
+		}
+	}
+
+	/**
+	 * 返回成功消息
+	 *
+	 * @return 成功消息
+	 */
+	public static AjaxResult success()
+	{
+		return AjaxResult.success("操作成功");
+	}
+
+	/**
+	 * 返回成功数据
+	 *
+	 * @return 成功消息
+	 */
+	public static AjaxResult success(Object data)
+	{
+		return AjaxResult.success("操作成功", data);
+	}
+
+	/**
+	 * 返回成功消息
+	 *
+	 * @param msg 返回内容
+	 * @return 成功消息
+	 */
+	public static AjaxResult success(String msg)
+	{
+		return AjaxResult.success(msg, null);
+	}
+
+	/**
+	 * 返回成功消息
+	 *
+	 * @param msg 返回内容
+	 * @param data 数据对象
+	 * @return 成功消息
+	 */
+	public static AjaxResult success(String msg, Object data)
+	{
+		return new AjaxResult(Type.SUCCESS, msg, data);
+	}
+
+	/**
+	 * 返回警告消息
+	 *
+	 * @param msg 返回内容
+	 * @return 警告消息
+	 */
+	public static AjaxResult warn(String msg)
+	{
+		return AjaxResult.warn(msg, null);
+	}
+
+	/**
+	 * 返回警告消息
+	 *
+	 * @param msg 返回内容
+	 * @param data 数据对象
+	 * @return 警告消息
+	 */
+	public static AjaxResult warn(String msg, Object data)
+	{
+		return new AjaxResult(Type.WARN, msg, data);
+	}
+
+	/**
+	 * 返回错误消息
+	 *
+	 * @return
+	 */
+	public static AjaxResult error()
+	{
+		return AjaxResult.error("操作失败");
+	}
+
+	/**
+	 * 返回错误消息
+	 *
+	 * @param msg 返回内容
+	 * @return 警告消息
+	 */
+	public static AjaxResult error(String msg)
+	{
+		return AjaxResult.error(msg, null);
+	}
+
+	/**
+	 * 返回错误消息
+	 *
+	 * @param msg 返回内容
+	 * @param data 数据对象
+	 * @return 警告消息
+	 */
+	public static AjaxResult error(String msg, Object data)
+	{
+		return new AjaxResult(Type.ERROR, msg, data);
+	}
+
+	public Type getType()
+	{
+		return type;
+	}
+
+	public void setType(Type type)
+	{
+		this.type = type;
+	}
+
+	public int getCode()
+	{
+		return code;
+	}
+
+	public void setCode(int code)
+	{
+		this.code = code;
+	}
+
+	public String getMsg()
+	{
+		return msg;
+	}
+
+	public void setMsg(String msg)
+	{
+		this.msg = msg;
+	}
+
+	public Object getData()
+	{
+		return data;
+	}
+
+	public void setData(Object data)
+	{
+		this.data = data;
+	}
+
+	@Override
+	public String toString()
+	{
+		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("code", getCode())
+				.append("msg", getMsg()).append("data", getData()).toString();
+	}
+}

+ 13 - 0
src/main/java/com/example/demo/entity/ListenFrom.java

@@ -0,0 +1,13 @@
+package com.example.demo.entity;
+
+import com.sun.jna.NativeLong;
+import lombok.Data;
+
+@Data
+public class ListenFrom {
+
+    private NativeLong lUserID;
+
+    private NativeLong lAlarmHandle;
+
+}

+ 558 - 0
src/main/java/com/example/demo/hk/ClientDemo/ClientDemo.form

@@ -0,0 +1,558 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+  <NonVisualComponents>
+    <Menu class="javax.swing.JMenuBar" name="jMenuBarConfig">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.SoftBevelBorderInfo">
+            <BevelBorder/>
+          </Border>
+        </Property>
+      </Properties>
+      <SubComponents>
+        <Menu class="javax.swing.JMenu" name="jMenuConfig">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x914d;&#x7f6e;"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemBasicConfig">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x57fa;&#x672c;&#x4fe1;&#x606f;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemBasicConfigMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemNetwork">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x7f51;&#x7edc;&#x53c2;&#x6570;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemNetworkMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemChannel">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x901a;&#x9053;&#x53c2;&#x6570;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemChannelMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemAlarmCfg">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x62a5;&#x8b66;&#x53c2;&#x6570;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemAlarmCfgMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemSerialCfg">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x4e32;&#x53e3;&#x53c2;&#x6570;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemSerialCfgMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemUserConfig">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x7528;&#x6237;&#x914d;&#x7f6e;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemUserConfigMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemIPAccess">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="IP&#x63a5;&#x5165;&#x914d;&#x7f6e;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItemIPAccessActionPerformed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenuPlayBack">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x56de;&#x653e;"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemPlayBackRemote">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6309;&#x6587;&#x4ef6;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemPlayBackRemoteMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemPlayTime">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6309;&#x65f6;&#x95f4;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemPlayTimeMousePressed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenuSetAlarm">
+          <Properties>
+            <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+              <Border info="null"/>
+            </Property>
+            <Property name="text" type="java.lang.String" value="&#x62a5;&#x8b66;"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JRadioButtonMenuItem" name="jRadioButtonMenuSetAlarm">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x3007;&#x5e03;&#x9632;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jRadioButtonMenuSetAlarmActionPerformed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JRadioButtonMenuItem" name="jRadioButtonMenuListen">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x3007;&#x76d1;&#x542c;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jRadioButtonMenuListenActionPerformed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemRemoveAlarm">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6e05;&#x7a7a;&#x62a5;&#x8b66;&#x4fe1;&#x606f;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemRemoveAlarmMousePressed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenuManage">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x7ba1;&#x7406;"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemCheckTime">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6821;&#x65f6;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemCheckTimeMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemFormat">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x683c;&#x5f0f;&#x5316;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemFormatMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemUpgrade">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5347;&#x7ea7;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemUpgradeMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JSeparator" name="jSeparator1">
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemReboot">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x91cd;&#x542f;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemRebootMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemShutDown">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5173;&#x95ed;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemShutDownMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JSeparator" name="jSeparator2">
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemDefault">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6062;&#x590d;&#x9ed8;&#x8ba4;&#x53c2;&#x6570;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemDefaultMousePressed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemDeviceState">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x8bbe;&#x5907;&#x72b6;&#x6001;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemDeviceStateMousePressed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenuVoice">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8bed;&#x97f3;"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItemVoiceCom">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x8bed;&#x97f3;&#x5bf9;&#x8bb2;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jMenuItemVoiceComMousePressed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+      </SubComponents>
+    </Menu>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="3"/>
+    <Property name="title" type="java.lang.String" value="ClientDemo"/>
+    <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+      <Font name="&#x5b8b;&#x4f53;" size="10" style="0"/>
+    </Property>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBarConfig"/>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="jSplitPaneHorizontal" alignment="0" pref="866" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="jSplitPaneHorizontal" alignment="0" pref="671" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JSplitPane" name="jSplitPaneHorizontal">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+            <EmptyBorder/>
+          </Border>
+        </Property>
+        <Property name="dividerLocation" type="int" value="155"/>
+        <Property name="dividerSize" type="int" value="2"/>
+      </Properties>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
+      <SubComponents>
+        <Container class="javax.swing.JPanel" name="jPanelUserInfo">
+          <Properties>
+            <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+              <Border info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
+                <EtchetBorder>
+                  <Color PropertyName="highlight" blue="ff" green="ff" red="cc" type="rgb"/>
+                </EtchetBorder>
+              </Border>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+              <JSplitPaneConstraints position="left"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                      <Component id="jLabelIPAddress" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="14" pref="14" max="14" attributes="0"/>
+                      <Component id="jTextFieldIPAddress" min="-2" pref="80" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                      <Component id="jLabelUserName" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="14" pref="14" max="14" attributes="0"/>
+                      <Component id="jTextFieldUserName" min="-2" pref="80" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                      <Component id="jLabelPassWord" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="26" pref="26" max="26" attributes="0"/>
+                      <Component id="jPasswordFieldPassword" min="-2" pref="80" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jButtonLogin" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="jButtonRealPlay" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                      <Component id="jLabelPortNumber" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="26" pref="26" max="26" attributes="0"/>
+                      <Component id="jTextFieldPortNumber" min="-2" pref="80" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="1" attributes="0">
+                      <EmptySpace pref="83" max="32767" attributes="0"/>
+                      <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+                  <Component id="jScrollPaneTree" alignment="0" pref="150" max="32767" attributes="1"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jComboBoxCallback" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace pref="66" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="18" pref="18" max="18" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jLabelIPAddress" min="-2" max="-2" attributes="0"/>
+                          <Component id="jTextFieldIPAddress" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jLabelUserName" min="-2" max="-2" attributes="0"/>
+                          <Component id="jTextFieldUserName" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jLabelPassWord" min="-2" max="-2" attributes="0"/>
+                          <Component id="jPasswordFieldPassword" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jLabelPortNumber" min="-2" max="-2" attributes="0"/>
+                          <Component id="jTextFieldPortNumber" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="jButtonLogin" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="jButtonRealPlay" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="jScrollPaneTree" min="-2" pref="404" max="-2" attributes="0"/>
+                      <EmptySpace type="separate" max="-2" attributes="0"/>
+                      <Component id="jComboBoxCallback" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
+                      <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JButton" name="jButtonRealPlay">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x9884;&#x89c8;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonRealPlayActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonLogin">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6ce8;&#x518c;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonLoginActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabelUserName">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x7528;&#x6237;&#x540d;"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabelIPAddress">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="IP&#x5730;&#x5740;"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldPortNumber">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="8000"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldIPAddress">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="172.4.1.170"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabelPortNumber">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x7aef;&#x53e3;"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabelPassWord">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5bc6;&#x7801;"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JPasswordField" name="jPasswordFieldPassword">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="12345"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldUserName">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="admin"/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonExit">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+              </Events>
+            </Component>
+            <Container class="javax.swing.JScrollPane" name="jScrollPaneTree">
+              <AuxValues>
+                <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+              </AuxValues>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+              <SubComponents>
+                <Component class="javax.swing.JTree" name="jTreeDevice">
+                  <Properties>
+                    <Property name="model" type="javax.swing.tree.TreeModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+                      <Connection code="this.initialTreeModel()" type="code"/>
+                    </Property>
+                  </Properties>
+                </Component>
+              </SubComponents>
+            </Container>
+            <Component class="javax.swing.JComboBox" name="jComboBoxCallback">
+              <Properties>
+                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+                  <StringArray count="2">
+                    <StringItem index="0" value="&#x76f4;&#x63a5;&#x9884;&#x89c8;"/>
+                    <StringItem index="1" value="&#x56de;&#x8c03;&#x9884;&#x89c8;"/>
+                  </StringArray>
+                </Property>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JSplitPane" name="jSplitPaneVertical">
+          <Properties>
+            <Property name="dividerLocation" type="int" value="579"/>
+            <Property name="dividerSize" type="int" value="2"/>
+            <Property name="orientation" type="int" value="0"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+              <JSplitPaneConstraints position="right"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
+          <SubComponents>
+            <Container class="javax.swing.JPanel" name="jPanelRealplayArea">
+              <Properties>
+                <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+                  <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+                    <LineBorder>
+                      <Color PropertyName="color" blue="66" green="ff" red="99" type="rgb"/>
+                    </LineBorder>
+                  </Border>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+                  <JSplitPaneConstraints position="top"/>
+                </Constraint>
+              </Constraints>
+
+              <Layout>
+                <DimensionLayout dim="0">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="panelRealplay" alignment="1" max="32767" attributes="0"/>
+                  </Group>
+                </DimensionLayout>
+                <DimensionLayout dim="1">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="panelRealplay" alignment="0" max="32767" attributes="0"/>
+                  </Group>
+                </DimensionLayout>
+              </Layout>
+              <SubComponents>
+                <Container class="java.awt.Panel" name="panelRealplay">
+                  <Events>
+                    <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="panelRealplayMousePressed"/>
+                  </Events>
+
+                  <Layout>
+                    <DimensionLayout dim="0">
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <EmptySpace min="0" pref="704" max="32767" attributes="0"/>
+                      </Group>
+                    </DimensionLayout>
+                    <DimensionLayout dim="1">
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <EmptySpace min="0" pref="576" max="32767" attributes="0"/>
+                      </Group>
+                    </DimensionLayout>
+                  </Layout>
+                </Container>
+              </SubComponents>
+            </Container>
+            <Container class="javax.swing.JScrollPane" name="jScrollPanelAlarmList">
+              <Properties>
+                <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+                  <Border info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
+                    <EtchetBorder/>
+                  </Border>
+                </Property>
+              </Properties>
+              <AuxValues>
+                <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+              </AuxValues>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+                  <JSplitPaneConstraints position="right"/>
+                </Constraint>
+              </Constraints>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+              <SubComponents>
+                <Component class="javax.swing.JTable" name="jTableAlarm">
+                  <Properties>
+                    <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+                      <Connection code="this.initialTableModel()" type="code"/>
+                    </Property>
+                  </Properties>
+                </Component>
+              </SubComponents>
+            </Container>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

File diff suppressed because it is too large
+ 1464 - 0
src/main/java/com/example/demo/hk/ClientDemo/ClientDemo.java


File diff suppressed because it is too large
+ 3332 - 0
src/main/java/com/example/demo/hk/ClientDemo/HCNetSDK.java


+ 639 - 0
src/main/java/com/example/demo/hk/ClientDemo/HCNetTools.java

@@ -0,0 +1,639 @@
+package com.example.demo.hk.ClientDemo;
+
+
+import cc.eguid.FFmpegCommandManager.FFmpegManager;
+import com.example.demo.entity.ListenFrom;
+import com.example.demo.hk.entity.Device;
+import com.example.demo.listen.LestenMSGCallBack;
+import com.example.demo.listen.LestenMSGCallBackUtil;
+import com.example.demo.web.DeviceController;
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
+import com.sun.jna.ptr.NativeLongByReference;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+/**
+ * Created by zdd on 2020/6/10
+ */
+
+@Slf4j
+public class HCNetTools {
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    //static PlayCtrl playControl = PlayCtrl.INSTANCE;
+
+    HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
+    HCNetSDK.NET_DVR_IPPARACFG m_strIpparaCfg;//IP参数
+    HCNetSDK.NET_DVR_CLIENTINFO m_strClientInfo;//用户参数
+
+    boolean bRealPlay;//是否在预览.
+    String m_sDeviceIP;//已登录设备的IP地址
+
+    NativeLong lUserID;//用户句柄
+    NativeLong loadHandle;//下载句柄
+    NativeLong lPreviewHandle;//预览句柄
+    NativeLong m_lRealHandle;//云台句柄
+    NativeLong lListenHandle;//报警监听句柄
+    NativeLong lAlarmHandle;//报警布防句柄
+
+
+    NativeLongByReference m_lPort;//回调预览时播放库端口指针
+
+
+    FFmpegManager manager;//rstp转rmtp工具
+
+    //FRealDataCallBack fRealDataCallBack;//预览回调函数实现
+    public HCNetTools() {
+        JPopupMenu.setDefaultLightWeightPopupEnabled(false);//防止被播放窗口(AWT组件)覆盖
+        lUserID = new NativeLong(-1);
+        lPreviewHandle = new NativeLong(-1);
+        m_lRealHandle = new NativeLong(1);
+        lListenHandle = new NativeLong(-1);
+        lAlarmHandle = new NativeLong(-1);
+        m_lPort = new NativeLongByReference(new NativeLong(-1));
+        //fRealDataCallBack= new FRealDataCallBack();
+    }
+
+    /**
+     * 初始化资源配置
+     */
+    public int initDevices() {
+        boolean b = hCNetSDK.NET_DVR_Init();
+        if (!b) {
+            //初始化失败
+            //throw new RuntimeException("初始化失败");
+            System.out.println("初始化失败");
+            return 1;
+        }
+        return 0;
+    }
+
+    /**
+     * 设备注册
+     *
+     * @param name     设备用户名
+     * @param password 设备登录密码
+     * @param ip       IP地址
+     * @param port     端口
+     * @return 结果
+     */
+    public int deviceRegist(String name, String password, String ip, String port) {
+
+        if (bRealPlay) {//判断当前是否在预览
+            return 2;//"注册新用户请先停止当前预览";
+        }
+        if (lUserID.longValue() > -1) {//先注销,在登录
+            hCNetSDK.NET_DVR_Logout_V30(lUserID);
+            lUserID = new NativeLong(-1);
+        }
+        //注册(既登录设备)开始
+        m_sDeviceIP = ip;
+        short iPort = Integer.valueOf(port).shortValue();
+        m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();//获取设备参数结构
+        lUserID = hCNetSDK.NET_DVR_Login_V30(ip, iPort, name, password, m_strDeviceInfo);//登录设备
+        long userID = lUserID.longValue();
+        if (userID == -1) {
+            int iErr = hCNetSDK.NET_DVR_GetLastError();
+            System.out.println(":注册失败,错误号:" + iErr);
+            System.out.println(hCNetSDK.NET_DVR_GetErrorMsg(m_lPort));
+            m_sDeviceIP = "";//登录未成功,IP置为空
+            return 3;//"注册失败";
+        }
+        return 0;
+    }
+
+    /**
+     * 获取设备通道
+     */
+    public int getChannelNumber() {
+        IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
+        boolean bRet = false;
+        int iChannelNum = -1;
+
+        m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG();
+        m_strIpparaCfg.write();
+        Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
+        bRet = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
+        m_strIpparaCfg.read();
+
+        String devices = "";
+        if (!bRet) {
+            //设备不支持,则表示没有IP通道
+            for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++) {
+                devices = "Camera" + (iChannum + m_strDeviceInfo.byStartChan);
+            }
+        } else {
+            for (int iChannum = 0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum++) {
+                if (m_strIpparaCfg.struIPChanInfo[iChannum].byEnable == 1) {
+                    devices = "IPCamera" + (iChannum + m_strDeviceInfo.byStartChan);
+                }
+            }
+        }
+        if (StringUtils.isNotEmpty(devices)) {
+            if (devices.charAt(0) == 'C') {//Camara开头表示模拟通道
+                //子字符串中获取通道号
+                iChannelNum = Integer.parseInt(devices.substring(6));
+            } else {
+                if (devices.charAt(0) == 'I') {//IPCamara开头表示IP通道
+                    //子字符创中获取通道号,IP通道号要加32
+                    iChannelNum = Integer.parseInt(devices.substring(8)) + 32;
+                } else {
+                    return 4;
+                }
+            }
+        }
+        return iChannelNum;
+    }
+
+    public void shutDownDev() {
+        //如果已经注册,注销
+        if (lUserID.longValue() > -1) {
+            hCNetSDK.NET_DVR_Logout_V30(lUserID);
+        }
+        hCNetSDK.NET_DVR_Cleanup();
+    }
+
+
+    /**
+     * 抓拍图片
+     *
+     * @param dev
+     */
+    public void getDVRPic(Device dev, int chan, String imgpath) {
+        NativeLong chanLong = new NativeLong(chan);
+
+        if (!hCNetSDK.NET_DVR_Init()) {
+            log.warn("hksdk(抓图)-海康sdk初始化失败!");
+            return;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        //注册设备
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+
+        if (lUserID.intValue() < 0) {
+            log.warn("hksdk(抓图)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
+            return;
+        }
+        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
+        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
+            // 返回Boolean值,判断是否获取设备能力
+            log.info("hksdk(抓图)-返回设备状态失败");
+        }
+        //图片质量
+        HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
+        //设置图片分辨率
+        jpeg.wPicSize = 3;
+        //设置图片质量
+        jpeg.wPicQuality = 0;
+        IntByReference a = new IntByReference();
+        //设置图片大小
+        ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
+        //String jpegBuffer ="1024 * 1024";
+        File file = new File(imgpath);
+        // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
+        //需要加入通道
+        boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID, chanLong, jpeg, jpegBuffer, 1024 * 1024, a);
+        if (is) {
+            log.info("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
+            //存储到本地
+            BufferedOutputStream outputStream = null;
+            try {
+                outputStream = new BufferedOutputStream(new FileOutputStream(file));
+                outputStream.write(jpegBuffer.array(), 0, a.getValue());
+                outputStream.flush();
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            } finally {
+                if (outputStream != null) {
+                    try {
+                        outputStream.close();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        } else {
+            log.info("hksdk(抓图)-抓取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
+        }
+
+        //退出登录
+        hCNetSDK.NET_DVR_Logout(lUserID);
+        //cleanup SDK
+        hCNetSDK.NET_DVR_Cleanup();
+    }
+
+    /* *
+     * @Description:  下载录像
+     * @param null
+     * @Return:
+     * @Author: miaozm
+     * @Date: 2020/4/7 14:50
+     */
+    public boolean downloadVideo(Device dev, Date startTime, Date endTime, String filePath, int channel) {
+        boolean initFlag = hCNetSDK.NET_DVR_Init();
+        if (!initFlag) { //返回值为布尔值 fasle初始化失败
+            log.warn("hksdk(视频)-海康sdk初始化失败!");
+            return false;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), deviceInfo);
+        log.info("hksdk(视频)-登录海康录像机信息,状态值:" + hCNetSDK.NET_DVR_GetLastError());
+        long lUserId = lUserID.longValue();
+        if (lUserId == -1) {
+            log.warn("hksdk(视频)-海康sdk登录失败!");
+            return false;
+        }
+        loadHandle = new NativeLong(-1);
+        if (loadHandle.intValue() == -1) {
+            loadHandle = hCNetSDK.NET_DVR_GetFileByTime(lUserID, new NativeLong(1), getHkTime(startTime), getHkTime(endTime), filePath);
+            log.info("hksdk(视频)-获取播放句柄信息,状态值:" + hCNetSDK.NET_DVR_GetLastError());
+            if (loadHandle.intValue() >= 0) {
+                boolean downloadFlag = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, HCNetSDK.NET_DVR_PLAYSTART, 0, null);
+                int tmp = -1;
+                IntByReference pos = new IntByReference();
+                while (true) {
+                    boolean backFlag = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, HCNetSDK.NET_DVR_PLAYGETPOS, 0, pos);
+                    if (!backFlag) {//防止单个线程死循环
+                        return downloadFlag;
+                    }
+                    int produce = pos.getValue();
+                    if ((produce % 10) == 0 && tmp != produce) {//输出进度
+                        tmp = produce;
+                        log.info("hksdk(视频)-视频下载进度:" + "==" + produce + "%");
+                    }
+                    if (produce == 100) {//下载成功
+                        hCNetSDK.NET_DVR_StopGetFile(loadHandle);
+                        loadHandle.setValue(-1);
+                        hCNetSDK.NET_DVR_Logout(lUserID);//退出录像机
+                        log.info("hksdk(视频)-退出状态" + hCNetSDK.NET_DVR_GetLastError());
+                        //hcNetSDK.NET_DVR_Cleanup();
+                        return true;
+                    }
+                    if (produce > 100) {//下载失败
+                        hCNetSDK.NET_DVR_StopGetFile(loadHandle);
+                        loadHandle.setValue(-1);
+                        log.warn("hksdk(视频)-海康sdk由于网络原因或DVR忙,下载异常终止!错误原因:" + hCNetSDK.NET_DVR_GetLastError());
+                        hCNetSDK.NET_DVR_Logout(lUserID);//退出录像机
+                        //log.info("hksdk(视频)-退出状态"+hcNetSDK.NET_DVR_GetLastError());
+                        return false;
+                    }
+                }
+            } else {
+                System.out.println("hksdk(视频)-下载失败" + hCNetSDK.NET_DVR_GetLastError());
+                return false;
+            }
+        }
+        return false;
+    }
+
+
+    /* *
+     * @Description:  获取录像文件信息
+     * @param null
+     * @Return:
+     * @Author: miaozm
+     * @Date: 2020/4/7 14:50
+     */
+    public List getFileList(Device dev, Date startTime, Date endTime, int channel) {
+        List fileList = new ArrayList();
+        boolean initFlag = hCNetSDK.NET_DVR_Init();
+        if (!initFlag) { //返回值为布尔值 fasle初始化失败
+            log.warn("hksdk(视频)-海康sdk初始化失败!");
+            //return null;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), deviceInfo);
+        log.info("hksdk(视频)-登录海康录像机信息,状态值:" + hCNetSDK.NET_DVR_GetLastError());
+        long lUserId = lUserID.longValue();
+        if (lUserId == -1) {
+            log.warn("hksdk(视频)-海康sdk登录失败!");
+            //return null;
+        }
+        // 搜索条件
+        HCNetSDK.NET_DVR_FILECOND m_strFilecond = new HCNetSDK.NET_DVR_FILECOND();
+        m_strFilecond.struStartTime = getHkTime(startTime);
+        m_strFilecond.struStopTime = getHkTime(endTime);
+        m_strFilecond.lChannel = new NativeLong(channel);//通道号
+
+        NativeLong lFindFile = hCNetSDK.NET_DVR_FindFile_V30(lUserID, m_strFilecond);
+        HCNetSDK.NET_DVR_FINDDATA_V30 strFile = new HCNetSDK.NET_DVR_FINDDATA_V30();
+        long findFile = lFindFile.longValue();
+        if (findFile > -1) {
+            System.out.println("file" + findFile);
+        }
+        NativeLong lnext;
+        strFile = new HCNetSDK.NET_DVR_FINDDATA_V30();
+        Map map = null;
+        boolean flag = true;
+        while (flag) {
+            lnext = hCNetSDK.NET_DVR_FindNextFile_V30(lFindFile, strFile);
+            if (lnext.longValue() == HCNetSDK.NET_DVR_FILE_SUCCESS) {
+                //搜索成功
+                map = new HashMap<>();
+                //添加文件名信息
+                String[] s = new String[2];
+                s = new String(strFile.sFileName).split("\0", 2);
+                map.put("fileName", new String(s[0]));
+
+                int iTemp;
+                String MyString;
+                if (strFile.dwFileSize < 1024 * 1024) {
+                    iTemp = (strFile.dwFileSize) / (1024);
+                    MyString = iTemp + "K";
+                } else {
+                    iTemp = (strFile.dwFileSize) / (1024 * 1024);
+                    MyString = iTemp + "M   ";
+                    iTemp = ((strFile.dwFileSize) % (1024 * 1024)) / (1204);
+                    MyString = MyString + iTemp + "K";
+                }
+                map.put("fileSize", MyString);                      //添加文件大小信息
+                map.put("struStartTime", strFile.struStartTime.toStringTime());                      //添加开始时间信息
+                map.put("struStopTime", strFile.struStopTime.toStringTime());                      //添加结束时间信息
+                fileList.add(map);
+            } else {
+                if (lnext.longValue() == HCNetSDK.NET_DVR_ISFINDING) {//搜索中
+                    //System.out.println("搜索中");
+                    continue;
+                } else {
+                    flag = false;
+                    if (lnext.longValue() == HCNetSDK.NET_DVR_FILE_NOFIND) {
+                        //flag=false;
+                    } else {
+                        //flag=false;
+                        System.out.println("搜索文件结束");
+                        boolean flag2 = hCNetSDK.NET_DVR_FindClose_V30(lFindFile);
+                        if (flag2 == false) {
+                            System.out.println("结束搜索失败");
+                        }
+                    }
+                }
+            }
+        }
+        return fileList;
+    }
+
+    /**
+     * 获取海康录像机格式的时间
+     *
+     * @param time
+     * @return
+     */
+    public HCNetSDK.NET_DVR_TIME getHkTime(Date time) {
+        HCNetSDK.NET_DVR_TIME structTime = new HCNetSDK.NET_DVR_TIME();
+        String str = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(time);
+        String[] times = str.split("-");
+        structTime.dwYear = Integer.parseInt(times[0]);
+        structTime.dwMonth = Integer.parseInt(times[1]);
+        structTime.dwDay = Integer.parseInt(times[2]);
+        structTime.dwHour = Integer.parseInt(times[3]);
+        structTime.dwMinute = Integer.parseInt(times[4]);
+        structTime.dwSecond = Integer.parseInt(times[5]);
+        return structTime;
+    }
+
+
+    /**
+     * 摄像头向上旋转
+     *
+     * @param dev
+     */
+    public void operation(Device dev, String operation) throws InterruptedException {
+        if (!hCNetSDK.NET_DVR_Init()) {
+            log.warn("hksdk(抓图)-海康sdk初始化失败!");
+            return;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        //注册设备
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+
+        if (lUserID.intValue() < 0) {
+            log.warn("hksdk(抓图)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
+            return;
+        }
+        boolean ret = false;
+        int parms = parms(operation);
+        ret = hCNetSDK.NET_DVR_PTZControl_Other(lUserID, m_lRealHandle, parms, 0);
+        Thread.sleep(500L);
+        ret = hCNetSDK.NET_DVR_PTZControl_Other(lUserID, m_lRealHandle, parms, 1);
+        if (!ret) {
+            log.warn("云台控制失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
+            return;
+        }
+        log.warn("云台控制成功:" + ret);
+        //退出登录
+        hCNetSDK.NET_DVR_Logout(lUserID);
+        //cleanup SDK
+        hCNetSDK.NET_DVR_Cleanup();
+    }
+
+    private int parms(String operation) {
+        int parm = 0;
+        switch (operation) {
+            case "up":
+                //语句
+                parm = HCNetSDK.TILT_UP;
+                break; //可选
+            case "down":
+                //语句
+                parm = HCNetSDK.TILT_DOWN;
+                break; //可选
+            case "left":
+                //语句
+                parm = HCNetSDK.PAN_LEFT;
+                break; //可选
+            case "right":
+                //语句
+                parm = HCNetSDK.PAN_RIGHT;
+                break; //可选
+            case "lightPwron":
+                //语句
+                parm = HCNetSDK.LIGHT_PWRON;
+                break; //可选
+        }
+        return parm;
+    }
+
+
+    public Object info(Device dev) {
+        String obj = "";
+        if (!hCNetSDK.NET_DVR_Init()) {
+            obj = "hksdk(sdk)-海康sdk初始化失败!";
+            log.error(obj);
+            return obj;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        //注册设备
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+
+        if (lUserID.intValue() < 0) {
+            String msg = "hksdk(设备)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+            log.error(msg);
+            return msg;
+        }
+        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
+        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
+            // 返回Boolean值,判断是否获取设备能力
+            log.info("hksdk(设备)-返回设备状态失败");
+        }
+        //退出登录
+        hCNetSDK.NET_DVR_Logout(lUserID);
+        //cleanup SDK
+        hCNetSDK.NET_DVR_Cleanup();
+        return devwork;
+    }
+
+    public Object DvrList(Device dev) {
+        String obj = "";
+        if (!hCNetSDK.NET_DVR_Init()) {
+            obj = "hksdk(sdk)-海康sdk初始化失败!";
+            log.error(obj);
+            return obj;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        //注册设备
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+
+        if (lUserID.intValue() < 0) {
+            String msg = "hksdk(设备)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+            log.error(msg);
+            return msg;
+        }
+        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
+        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
+            // 返回Boolean值,判断是否获取设备能力
+            log.info("hksdk(设备)-返回设备状态失败");
+        }
+        //退出登录
+        hCNetSDK.NET_DVR_Logout(lUserID);
+        //cleanup SDK
+        hCNetSDK.NET_DVR_Cleanup();
+        return devwork;
+    }
+
+    public Object log(Device dev, Date startTime, Date endTime) {
+        String obj = "";
+        if (!hCNetSDK.NET_DVR_Init()) {
+            obj = "hksdk(sdk)-海康sdk初始化失败!";
+            log.error(obj);
+            return obj;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        //注册设备
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+
+        if (lUserID.intValue() < 0) {
+            String msg = "hksdk(设备)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+            log.error(msg);
+            return msg;
+        }
+        NativeLong nativeLong = new NativeLong(2);
+        NativeLong re = hCNetSDK.NET_DVR_FindDVRLog_V30(lUserID, nativeLong, 0, 0, getHkTime(startTime), getHkTime(endTime), false);
+        //退出登录
+        hCNetSDK.NET_DVR_Logout(lUserID);
+        //cleanup SDK
+        hCNetSDK.NET_DVR_Cleanup();
+        return re;
+    }
+
+    public Object msg(Device dev) {
+        String obj = "";
+        if (!hCNetSDK.NET_DVR_Init()) {
+            obj = "hksdk(sdk)-海康sdk初始化失败!";
+            log.error(obj);
+            return obj;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        //注册设备
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+
+        if (lUserID.intValue() < 0) {
+            String msg = "hksdk(设备)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+            log.error(msg);
+            return msg;
+        }
+        HCNetSDK.NET_DVR_RECORD_V30 lpStatusList = new HCNetSDK.NET_DVR_RECORD_V30();
+
+        HCNetSDK.NET_DVR_RECORD_V30 lpInBuffer = new HCNetSDK.NET_DVR_RECORD_V30();
+        lpInBuffer.setAutoRead(true);
+
+        HCNetSDK.NET_DVR_RECORD_V30 lpOutBuffer = new HCNetSDK.NET_DVR_RECORD_V30();
+
+        boolean bol = hCNetSDK.NET_DVR_GetDeviceStatus(lUserID, HCNetSDK.NET_DVR_GET_DEVICECFG, 10, lpInBuffer, 10, lpStatusList, lpOutBuffer, 10);
+        //退出登录
+        hCNetSDK.NET_DVR_Logout(lUserID);
+        //cleanup SDK
+        hCNetSDK.NET_DVR_Cleanup();
+        return lpInBuffer;
+    }
+
+
+    public Object listen(Device dev, String status, ListenFrom listenFrom) {
+        String msg = "success";
+        if (!hCNetSDK.NET_DVR_Init()) {
+            msg = "hksdk(sdk)-海康sdk初始化失败!";
+            log.error(msg);
+            return msg;
+        }
+        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
+        lUserID = hCNetSDK.NET_DVR_Login_V30(dev.getIp(), Short.valueOf(dev.getPort()), dev.getAccount(), dev.getPassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo
+        if (lUserID.intValue() < 0) {
+            msg = "hksdk(设备)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+            log.error(msg);
+            return msg;
+        }
+        //选择监听
+        if ("start".equals(status)) {
+            //尚未监听,开始监听
+            Pointer pUser = null;
+            if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(LestenMSGCallBackUtil.fMSFCallBack, pUser)) {
+                msg = "注册回调函数失败!";
+                log.error(msg);
+                return msg;
+            }
+            lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V30(lUserID);
+            if (lAlarmHandle.intValue() == -1) {
+                msg = "布防失败:" + lAlarmHandle;
+                log.error(msg);
+                return msg;
+            }
+            listenFrom = new ListenFrom();
+            listenFrom.setLUserID(lUserID);
+            listenFrom.setLAlarmHandle(lAlarmHandle);
+            return listenFrom;
+        }//停止监听
+        else if ("stop".equals(status)) {
+            lUserID = listenFrom.getLUserID();
+            lAlarmHandle = listenFrom.getLAlarmHandle();
+            if (lListenHandle.intValue() != -1) {
+                if (!hCNetSDK.NET_DVR_CloseAlarmChan_V30(this.lAlarmHandle)) {
+                    msg = "开始监听失败:" + lListenHandle;
+                    log.error(msg);
+                    this.lAlarmHandle = new NativeLong(-1);
+                } else {
+                    this.lAlarmHandle = new NativeLong(-1);
+                }
+                return msg;
+            }
+            //退出登录
+            hCNetSDK.NET_DVR_Logout_V30(this.lUserID);
+            //cleanup SDK
+            hCNetSDK.NET_DVR_Cleanup();
+            return msg;
+        }
+        return msg;
+    }
+}
+

File diff suppressed because it is too large
+ 2452 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogAlarmCfg.form


File diff suppressed because it is too large
+ 2391 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogAlarmCfg.java


+ 316 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogBasicConfig.form

@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x57fa;&#x672c;&#x4fe1;&#x606f;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,113,0,0,1,-15"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+    <Property name="useNullLayout" type="boolean" value="true"/>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x57fa;&#x672c;&#x914d;&#x7f6e;&#x4fe1;&#x606f;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="20" width="480" height="190"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8bbe;&#x5907;&#x540d;&#x79f0;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="30" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x901a;&#x9053;&#x4e2a;&#x6570;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="60" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x62a5;&#x8b66;&#x8f93;&#x5165;&#x6570;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="90" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel4">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x4ea7;&#x54c1;&#x5e8f;&#x5217;&#x53f7;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="150" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel5">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8bbe;&#x5907;&#x7c7b;&#x578b;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="250" y="30" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel6">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x786c;&#x76d8;&#x6570;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="250" y="60" width="50" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel7">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x62a5;&#x8b66;&#x8f93;&#x51fa;&#x6570;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="250" y="90" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel8">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x9065;&#x63a7;&#x5668;ID"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="250" y="120" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel9">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5faa;&#x73af;&#x5f55;&#x50cf;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="120" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldDeviceName">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="30" width="120" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldChannelNumber">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="60" width="120" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldAlarmInNumber">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="90" width="120" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxCycleRecord">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="2">
+                <StringItem index="0" value="&#x5426;"/>
+                <StringItem index="1" value="&#x662f;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="120" width="120" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldSerial">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="150" width="340" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxDeviceType">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="0"/>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="320" y="30" width="130" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldHDNumber">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="320" y="60" width="130" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldAlarmOutNumber">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="320" y="90" width="130" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldTelCtlVersion">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="320" y="120" width="130" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel2">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x8bbe;&#x5907;&#x7248;&#x672c;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="219" width="480" height="100"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel10">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8f6f;&#x4ef6;&#x7248;&#x672c;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="30" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel11">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="DSP&#x8f6f;&#x4ef6;&#x7248;&#x672c;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="60" width="80" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel12">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x786c;&#x4ef6;&#x7248;&#x672c;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="250" y="30" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel13">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x524d;&#x9762;&#x677f;&#x7248;&#x672c;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="250" y="60" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldSoftwareVersion">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="30" width="130" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldDSPVersion">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="110" y="60" width="130" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldHardWareVersion">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="320" y="30" width="140" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldPanelVersion">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="320" y="60" width="140" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="20" y="330" width="100" height="-1"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+  </SubComponents>
+</Form>

+ 393 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogBasicConfig.java

@@ -0,0 +1,393 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogBasicConfig.java
+ *
+ * Created on 2009-10-28, 11:50:54
+ */
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
+
+import javax.swing.*;
+
+/*****************************************************************************
+ *类 :JDialogBasicConfig
+ *类描述 :设备基本信息显示
+ ****************************************************************************/
+public class JDialogBasicConfig extends javax.swing.JDialog
+{
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    private HCNetSDK.NET_DVR_DEVICECFG m_strDeviceCfg;//设备信息
+    private NativeLong m_lUserID;//用户ID
+
+    /*************************************************
+    函数:      构造函数
+    函数描述:	Creates new form JDialogBasicConfig
+     *************************************************/
+    public JDialogBasicConfig(java.awt.Frame parent, boolean modal, NativeLong lUserID)
+    {
+        super(parent, modal);
+
+        m_lUserID = lUserID;
+        initComponents();
+        initDialog();
+    }
+
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel1 = new javax.swing.JPanel();
+        jLabel1 = new javax.swing.JLabel();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel4 = new javax.swing.JLabel();
+        jLabel5 = new javax.swing.JLabel();
+        jLabel6 = new javax.swing.JLabel();
+        jLabel7 = new javax.swing.JLabel();
+        jLabel8 = new javax.swing.JLabel();
+        jLabel9 = new javax.swing.JLabel();
+        jTextFieldDeviceName = new javax.swing.JTextField();
+        jTextFieldChannelNumber = new javax.swing.JTextField();
+        jTextFieldAlarmInNumber = new javax.swing.JTextField();
+        jComboBoxCycleRecord = new javax.swing.JComboBox();
+        jTextFieldSerial = new javax.swing.JTextField();
+        jComboBoxDeviceType = new javax.swing.JComboBox();
+        jTextFieldHDNumber = new javax.swing.JTextField();
+        jTextFieldAlarmOutNumber = new javax.swing.JTextField();
+        jTextFieldTelCtlVersion = new javax.swing.JTextField();
+        jPanel2 = new javax.swing.JPanel();
+        jLabel10 = new javax.swing.JLabel();
+        jLabel11 = new javax.swing.JLabel();
+        jLabel12 = new javax.swing.JLabel();
+        jLabel13 = new javax.swing.JLabel();
+        jTextFieldSoftwareVersion = new javax.swing.JTextField();
+        jTextFieldDSPVersion = new javax.swing.JTextField();
+        jTextFieldHardWareVersion = new javax.swing.JTextField();
+        jTextFieldPanelVersion = new javax.swing.JTextField();
+        jButtonExit = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("基本信息");
+        getContentPane().setLayout(null);
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("基本配置信息"));
+        jPanel1.setLayout(null);
+
+        jLabel1.setText("设备名称");
+        jPanel1.add(jLabel1);
+        jLabel1.setBounds(30, 30, 60, 15);
+
+        jLabel2.setText("通道个数");
+        jPanel1.add(jLabel2);
+        jLabel2.setBounds(30, 60, 60, 15);
+
+        jLabel3.setText("报警输入数");
+        jPanel1.add(jLabel3);
+        jLabel3.setBounds(30, 90, 70, 15);
+
+        jLabel4.setText("产品序列号");
+        jPanel1.add(jLabel4);
+        jLabel4.setBounds(30, 150, 70, 15);
+
+        jLabel5.setText("设备类型");
+        jPanel1.add(jLabel5);
+        jLabel5.setBounds(250, 30, 60, 15);
+
+        jLabel6.setText("硬盘数");
+        jPanel1.add(jLabel6);
+        jLabel6.setBounds(250, 60, 50, 15);
+
+        jLabel7.setText("报警输出数");
+        jPanel1.add(jLabel7);
+        jLabel7.setBounds(250, 90, 70, 15);
+
+        jLabel8.setText("遥控器ID");
+        jPanel1.add(jLabel8);
+        jLabel8.setBounds(250, 120, 70, 15);
+
+        jLabel9.setText("循环录像");
+        jPanel1.add(jLabel9);
+        jLabel9.setBounds(30, 120, 60, 15);
+        jPanel1.add(jTextFieldDeviceName);
+        jTextFieldDeviceName.setBounds(110, 30, 120, 21);
+        jPanel1.add(jTextFieldChannelNumber);
+        jTextFieldChannelNumber.setBounds(110, 60, 120, 21);
+        jPanel1.add(jTextFieldAlarmInNumber);
+        jTextFieldAlarmInNumber.setBounds(110, 90, 120, 21);
+
+        jComboBoxCycleRecord.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "否", "是" }));
+        jPanel1.add(jComboBoxCycleRecord);
+        jComboBoxCycleRecord.setBounds(110, 120, 120, 21);
+        jPanel1.add(jTextFieldSerial);
+        jTextFieldSerial.setBounds(110, 150, 340, 21);
+
+        jPanel1.add(jComboBoxDeviceType);
+        jComboBoxDeviceType.setBounds(320, 30, 130, 21);
+        jPanel1.add(jTextFieldHDNumber);
+        jTextFieldHDNumber.setBounds(320, 60, 130, 21);
+        jPanel1.add(jTextFieldAlarmOutNumber);
+        jTextFieldAlarmOutNumber.setBounds(320, 90, 130, 21);
+        jPanel1.add(jTextFieldTelCtlVersion);
+        jTextFieldTelCtlVersion.setBounds(320, 120, 130, 21);
+
+        getContentPane().add(jPanel1);
+        jPanel1.setBounds(10, 20, 480, 190);
+
+        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("设备版本"));
+        jPanel2.setLayout(null);
+
+        jLabel10.setText("软件版本");
+        jPanel2.add(jLabel10);
+        jLabel10.setBounds(30, 30, 70, 15);
+
+        jLabel11.setText("DSP软件版本");
+        jPanel2.add(jLabel11);
+        jLabel11.setBounds(30, 60, 80, 15);
+
+        jLabel12.setText("硬件版本");
+        jPanel2.add(jLabel12);
+        jLabel12.setBounds(250, 30, 60, 15);
+
+        jLabel13.setText("前面板版本");
+        jPanel2.add(jLabel13);
+        jLabel13.setBounds(250, 60, 70, 15);
+        jPanel2.add(jTextFieldSoftwareVersion);
+        jTextFieldSoftwareVersion.setBounds(110, 30, 130, 21);
+        jPanel2.add(jTextFieldDSPVersion);
+        jTextFieldDSPVersion.setBounds(110, 60, 130, 21);
+        jPanel2.add(jTextFieldHardWareVersion);
+        jTextFieldHardWareVersion.setBounds(320, 30, 140, 21);
+        jPanel2.add(jTextFieldPanelVersion);
+        jTextFieldPanelVersion.setBounds(320, 60, 140, 21);
+
+        getContentPane().add(jPanel2);
+        jPanel2.setBounds(10, 219, 480, 100);
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jButtonExit);
+        jButtonExit.setBounds(20, 330, 100, 23);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      "退出" 按钮单击相应函数
+    函数描述:	销毁窗口
+     *************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
+        this.dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+
+    /*************************************************
+    函数:      initDialog
+    函数描述:	初始化控件,显示参数
+     *************************************************/
+    private void initDialog()
+    {
+        jComboBoxDeviceType.addItem("DVR");//1   0
+        jComboBoxDeviceType.addItem("ATMDVR");//2   1
+        jComboBoxDeviceType.addItem("DVS");//3  2
+        jComboBoxDeviceType.addItem("DEC");//4  3
+        jComboBoxDeviceType.addItem("ENC_DEC");//5  4
+        jComboBoxDeviceType.addItem("DVR_HC");//6   5
+        jComboBoxDeviceType.addItem("DVR_HT");//7   6
+        jComboBoxDeviceType.addItem("DVR_HF");//8    7
+        jComboBoxDeviceType.addItem("DVR_HS");//9  8
+        jComboBoxDeviceType.addItem("DVR_HTS");//10  9
+        jComboBoxDeviceType.addItem("DVR_HB");//11  10
+        jComboBoxDeviceType.addItem("DVR_HCS");//12  11
+        jComboBoxDeviceType.addItem("DVS_A");//13  12
+        jComboBoxDeviceType.addItem("DVR_HC_S");//14   13
+        jComboBoxDeviceType.addItem("DVR_HT_S");//15   14
+        jComboBoxDeviceType.addItem("DVR_HF_S");//16   15
+        jComboBoxDeviceType.addItem("DVR_HS_S");//17  16
+        jComboBoxDeviceType.addItem("ATMDVR_S");//18   17
+        jComboBoxDeviceType.addItem("LOWCOST_DVR");//19   18
+        jComboBoxDeviceType.addItem("DEC_MAT");//20   19
+        jComboBoxDeviceType.addItem("DVR_MOBILE");//21   20
+        jComboBoxDeviceType.addItem("DVR_HD_S");//22   21
+        jComboBoxDeviceType.addItem("DVR_HD_SL");//23   22
+        jComboBoxDeviceType.addItem("DVR_HC_SL");//24   23
+        jComboBoxDeviceType.addItem("DVR_HS_ST");//25   24
+        jComboBoxDeviceType.addItem("DVS_HW");//26  25
+
+        jComboBoxDeviceType.addItem("IPCAM");//30   26
+        jComboBoxDeviceType.addItem("MEGA_IPCAM");//31   27
+        jComboBoxDeviceType.addItem("IPCAM_X62MF");//32   28
+
+        jComboBoxDeviceType.addItem("IPDOME");//40  29
+
+        jComboBoxDeviceType.addItem("IPMOD");//50   30
+
+        jComboBoxDeviceType.addItem("DS6101_HF_B");//63   31
+        jComboBoxDeviceType.addItem("DS6001_HF_B");//60   32
+
+        jComboBoxDeviceType.addItem("DS71XX_H");//71    33
+        jComboBoxDeviceType.addItem("DS72XX_H_S");//72   34
+        jComboBoxDeviceType.addItem("DS73XX_H_S");//73   35
+
+        jComboBoxDeviceType.addItem("DS81XX_HS_S");//81   36
+        jComboBoxDeviceType.addItem("DS81XX_HL_S");//82   37
+        jComboBoxDeviceType.addItem("DS81XX_HC_S");//83   38
+        jComboBoxDeviceType.addItem("DS81XX_HD_S");//84    39
+        jComboBoxDeviceType.addItem("DS81XX_HE_S");//85    40
+        jComboBoxDeviceType.addItem("DS81XX_HF_S");//86   41
+        jComboBoxDeviceType.addItem("DS81XX_AH_S");//87   42
+        jComboBoxDeviceType.addItem("DS81XX_AHF_S");//88   43
+
+        jComboBoxDeviceType.addItem("DS90XX_HF_S");//90   44
+        jComboBoxDeviceType.addItem("DS91XX_HF_S");//91   45
+        jComboBoxDeviceType.addItem("DS91XX_HD_S");//92   46
+
+        //函数获取设备配置参数
+        IntByReference ibrBytesReturned = new IntByReference(0);
+        m_strDeviceCfg = new HCNetSDK.NET_DVR_DEVICECFG();
+        m_strDeviceCfg.write();
+        Pointer lpPicConfig = m_strDeviceCfg.getPointer();
+        boolean getDVRConfigSuc = hCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, HCNetSDK.NET_DVR_GET_DEVICECFG,
+                new NativeLong(0), lpPicConfig, m_strDeviceCfg.size(), ibrBytesReturned);
+        m_strDeviceCfg.read();
+        if (getDVRConfigSuc != true)
+        {
+            System.out.println(hCNetSDK.NET_DVR_GetLastError());
+            JOptionPane.showMessageDialog(this, "获取设备参数失败");
+        }
+
+        String[] sName = new String[2];//设备名称
+        sName = new String(m_strDeviceCfg.sDVRName).split("\0", 2);
+        jTextFieldDeviceName.setText(sName[0]);
+        jTextFieldChannelNumber.setText(m_strDeviceCfg.byChanNum + "");//通道数
+        jTextFieldAlarmInNumber.setText(m_strDeviceCfg.byAlarmInPortNum + "");//报警输入个数
+        jComboBoxCycleRecord.setSelectedIndex(m_strDeviceCfg.dwRecycleRecord);//是否循环录像
+        jTextFieldSerial.setText(new String(m_strDeviceCfg.sSerialNumber));//序列号
+        jTextFieldHDNumber.setText(m_strDeviceCfg.byDiskNum + "");//硬盘数量
+        jTextFieldAlarmOutNumber.setText(m_strDeviceCfg.byAlarmOutPortNum + "");//报警输出个数
+        jTextFieldTelCtlVersion.setText(m_strDeviceCfg.dwDVRID + "");//遥控器ID
+
+        String sSoftWareVersion;//软件版本
+        if (((m_strDeviceCfg.dwSoftwareVersion >> 24) & 0xFF) > 0)
+        {
+            sSoftWareVersion = String.format("V%d.%d.%d build %02d%02d%02d", (m_strDeviceCfg.dwSoftwareVersion >> 24) & 0xFF, (m_strDeviceCfg.dwSoftwareVersion >> 16) & 0xFF, m_strDeviceCfg.dwSoftwareVersion & 0xFFFF, (m_strDeviceCfg.dwSoftwareBuildDate >> 16) & 0xFFFF, (m_strDeviceCfg.dwSoftwareBuildDate >> 8) & 0xFF, m_strDeviceCfg.dwSoftwareBuildDate & 0xFF);
+        } else
+        {
+            sSoftWareVersion = String.format("V%d.%d build %02d%02d%02d", (m_strDeviceCfg.dwSoftwareVersion >> 16) & 0xFFFF, m_strDeviceCfg.dwSoftwareVersion & 0xFFFF, (m_strDeviceCfg.dwSoftwareBuildDate >> 16) & 0xFFFF, (m_strDeviceCfg.dwSoftwareBuildDate >> 8) & 0xFF, m_strDeviceCfg.dwSoftwareBuildDate & 0xFF);
+        }
+        jTextFieldSoftwareVersion.setText(sSoftWareVersion);
+
+        String sDSPSoftVersion;//DSP软件版本
+        sDSPSoftVersion = String.format("V%d.%d build %02d%02d%02d", (m_strDeviceCfg.dwDSPSoftwareVersion >> 16) & 0xFFFF, m_strDeviceCfg.dwDSPSoftwareVersion & 0xFFFF, (m_strDeviceCfg.dwDSPSoftwareBuildDate >> 16) & 0xFFFF - 2000, (m_strDeviceCfg.dwDSPSoftwareBuildDate >> 8) & 0xFF, m_strDeviceCfg.dwDSPSoftwareBuildDate & 0xFF);
+        jTextFieldDSPVersion.setText(sDSPSoftVersion);
+
+        String sHardwareVersion;//硬件版本
+        sHardwareVersion = String.format("0x%x", m_strDeviceCfg.dwHardwareVersion);
+        jTextFieldHardWareVersion.setText(sHardwareVersion);
+
+        String sPanelVersion;//前面板版本
+        sPanelVersion = String.format("V%d", m_strDeviceCfg.dwPanelVersion);
+        jTextFieldPanelVersion.setText(sPanelVersion);
+
+        if (m_strDeviceCfg.byDVRType <= 26)
+        {//显示设备类型
+            jComboBoxDeviceType.setSelectedIndex(m_strDeviceCfg.byDVRType - 1);
+        } else
+        {
+            if (m_strDeviceCfg.byDVRType >= 30 && m_strDeviceCfg.byDVRType <= 32)
+            {
+                jComboBoxDeviceType.setSelectedIndex(m_strDeviceCfg.byDVRType - 6);
+            } else
+            {
+                if (m_strDeviceCfg.byDVRType == 40)
+                {
+                    jComboBoxDeviceType.setSelectedIndex(29);
+                } else
+                {
+                    if (m_strDeviceCfg.byDVRType == 50)
+                    {
+                        jComboBoxDeviceType.setSelectedIndex(30);
+                    } else
+                    {
+                        if (m_strDeviceCfg.byDVRType == 63)
+                        {
+                            jComboBoxDeviceType.setSelectedIndex(31);
+                        } else
+                        {
+                            if (m_strDeviceCfg.byDVRType == 60)
+                            {
+                                jComboBoxDeviceType.setSelectedIndex(32);
+                            } else
+                            {
+                                if (m_strDeviceCfg.byDVRType >= 71 && m_strDeviceCfg.byDVRType <= 73)
+                                {
+                                    jComboBoxDeviceType.setSelectedIndex(m_strDeviceCfg.byDVRType - 38);
+                                } else
+                                {
+                                    if (m_strDeviceCfg.byDVRType >= 81 && m_strDeviceCfg.byDVRType <= 88)
+                                    {
+                                        jComboBoxDeviceType.setSelectedIndex(m_strDeviceCfg.byDVRType - 45);
+                                    } else
+                                    {
+                                        if (m_strDeviceCfg.byDVRType >= 90 && m_strDeviceCfg.byDVRType <= 92)
+                                        {
+                                            jComboBoxDeviceType.setSelectedIndex(m_strDeviceCfg.byDVRType - 46);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+    }
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JComboBox jComboBoxCycleRecord;
+    private javax.swing.JComboBox jComboBoxDeviceType;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel10;
+    private javax.swing.JLabel jLabel11;
+    private javax.swing.JLabel jLabel12;
+    private javax.swing.JLabel jLabel13;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JLabel jLabel6;
+    private javax.swing.JLabel jLabel7;
+    private javax.swing.JLabel jLabel8;
+    private javax.swing.JLabel jLabel9;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JPanel jPanel2;
+    private javax.swing.JTextField jTextFieldAlarmInNumber;
+    private javax.swing.JTextField jTextFieldAlarmOutNumber;
+    private javax.swing.JTextField jTextFieldChannelNumber;
+    private javax.swing.JTextField jTextFieldDSPVersion;
+    private javax.swing.JTextField jTextFieldDeviceName;
+    private javax.swing.JTextField jTextFieldHDNumber;
+    private javax.swing.JTextField jTextFieldHardWareVersion;
+    private javax.swing.JTextField jTextFieldPanelVersion;
+    private javax.swing.JTextField jTextFieldSerial;
+    private javax.swing.JTextField jTextFieldSoftwareVersion;
+    private javax.swing.JTextField jTextFieldTelCtlVersion;
+    // End of variables declaration//GEN-END:variables
+}

File diff suppressed because it is too large
+ 1082 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogChannelConfig.form


File diff suppressed because it is too large
+ 1251 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogChannelConfig.java


+ 199 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogCheckTime.form

@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x6821;&#x65f6;"/>
+  </Properties>
+  <AccessibilityProperties>
+    <Property name="AccessibleContext.accessibleName" type="java.lang.String" value="null"/>
+  </AccessibilityProperties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace min="-2" pref="17" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="103" groupAlignment="1" attributes="0">
+                          <Group type="102" alignment="1" attributes="0">
+                              <Component id="jTextFieldHour" min="-2" pref="40" max="-2" attributes="0"/>
+                              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                              <Component id="jLabel4" min="-2" pref="27" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="102" alignment="1" attributes="0">
+                              <Component id="jTextFieldYear" min="-2" pref="40" max="-2" attributes="0"/>
+                              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                              <Component id="jLabel1" min="-2" pref="27" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Component id="jToggleButtonCheckTime" min="0" pref="0" max="32767" attributes="1"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldMonth" min="-2" pref="40" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jLabel2" min="-2" pref="27" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jTextFieldDay" min="-2" pref="40" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jLabel3" min="-2" pref="27" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldMinute" min="-2" pref="40" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="1" max="-2" attributes="0">
+                              <Component id="jToggleButtonExit" alignment="0" min="0" pref="0" max="32767" attributes="1"/>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jLabel5" min="-2" pref="27" max="-2" attributes="0"/>
+                                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldSecond" min="-2" pref="40" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jLabel6" min="-2" pref="27" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jTextFieldYear" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldMonth" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldDay" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jTextFieldHour" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldMinute" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel5" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldSecond" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel6" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="29" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jToggleButtonExit" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jToggleButtonCheckTime" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JToggleButton" name="jToggleButtonExit">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButtonExitActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldDay">
+        </Component>
+        <Component class="javax.swing.JToggleButton" name="jToggleButtonCheckTime">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6821;&#x65f6;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButtonCheckTimeActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6708;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldHour">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65e5;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldMonth">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel6">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x79d2;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldYear">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5e74;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldMinute">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel4">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldSecond">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel5">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

+ 247 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogCheckTime.java

@@ -0,0 +1,247 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogCheckTime.java
+ *
+ * Created on 2009-10-9, 14:41:20
+ */
+/**
+ *
+ * @author  Administrator
+ */
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+
+import javax.swing.*;
+import java.util.Calendar;
+import java.util.Date;
+
+/*****************************************************************************
+ *类 :JDialogCheckTime
+ *类描述 :校时
+ ****************************************************************************/
+public class JDialogCheckTime extends javax.swing.JDialog
+{
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    private NativeLong m_lUserId;//用户ID
+
+    /*************************************************
+    函数:      JDialogCheckTime
+    函数描述:	构造函数   Creates new form JDialogCheckTime
+     *************************************************/
+    public JDialogCheckTime(java.awt.Frame parent, boolean modal, NativeLong userId)
+    {
+        super(parent, modal);
+        initComponents();
+        m_lUserId = userId;
+        Date today = new Date();
+        Calendar now = Calendar.getInstance();//日历对象                                                                       //得到当前日期
+        now.setTime(today); //设置进去
+        jTextFieldYear.setText(now.get(Calendar.YEAR) + "");
+        jTextFieldMonth.setText((now.get(Calendar.MONTH) + 1) + "");
+        jTextFieldDay.setText(now.get(Calendar.DATE) + "");
+        jTextFieldHour.setText(now.get(Calendar.HOUR_OF_DAY) + "");
+        jTextFieldMinute.setText(now.get(Calendar.MINUTE) + "");
+        jTextFieldSecond.setText(now.get(Calendar.SECOND) + "");
+
+    }
+
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel1 = new javax.swing.JPanel();
+        jToggleButtonExit = new javax.swing.JToggleButton();
+        jTextFieldDay = new javax.swing.JTextField();
+        jToggleButtonCheckTime = new javax.swing.JToggleButton();
+        jLabel2 = new javax.swing.JLabel();
+        jTextFieldHour = new javax.swing.JTextField();
+        jLabel3 = new javax.swing.JLabel();
+        jTextFieldMonth = new javax.swing.JTextField();
+        jLabel6 = new javax.swing.JLabel();
+        jTextFieldYear = new javax.swing.JTextField();
+        jLabel1 = new javax.swing.JLabel();
+        jTextFieldMinute = new javax.swing.JTextField();
+        jLabel4 = new javax.swing.JLabel();
+        jTextFieldSecond = new javax.swing.JTextField();
+        jLabel5 = new javax.swing.JLabel();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("校时");
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
+
+        jToggleButtonExit.setText("退出");
+        jToggleButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButtonExitActionPerformed(evt);
+            }
+        });
+
+        jToggleButtonCheckTime.setText("校时");
+        jToggleButtonCheckTime.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButtonCheckTimeActionPerformed(evt);
+            }
+        });
+
+        jLabel2.setText("月");
+
+        jLabel3.setText("日");
+
+        jLabel6.setText("秒");
+
+        jLabel1.setText("年");
+
+        jLabel4.setText("时");
+
+        jLabel5.setText("分");
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+                .addGap(17, 17, 17)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                        .addGroup(jPanel1Layout.createSequentialGroup()
+                            .addComponent(jTextFieldHour, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                            .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
+                        .addGroup(jPanel1Layout.createSequentialGroup()
+                            .addComponent(jTextFieldYear, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                    .addComponent(jToggleButtonCheckTime, 0, 0, Short.MAX_VALUE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jTextFieldMonth, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jTextFieldDay, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jTextFieldMinute, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+                            .addComponent(jToggleButtonExit, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
+                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
+                                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                                .addComponent(jTextFieldSecond, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addContainerGap())
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addGap(20, 20, 20)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jTextFieldYear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel1)
+                    .addComponent(jTextFieldMonth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel2)
+                    .addComponent(jTextFieldDay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel3))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jTextFieldHour, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel4)
+                    .addComponent(jTextFieldMinute, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel5)
+                    .addComponent(jTextFieldSecond, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel6))
+                .addGap(29, 29, 29)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jToggleButtonExit)
+                    .addComponent(jToggleButtonCheckTime))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        getAccessibleContext().setAccessibleName(null);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      " 退出"  按钮响应函数
+    函数描述:	销毁对话框
+     *************************************************/
+    private void jToggleButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonExitActionPerformed
+        this.dispose();
+    }//GEN-LAST:event_jToggleButtonExitActionPerformed
+
+    /*************************************************
+    函数:       "校时"  按钮响应函数
+    函数描述:	 调用接口校时
+     *************************************************/
+    private void jToggleButtonCheckTimeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonCheckTimeActionPerformed
+        HCNetSDK.NET_DVR_TIME strCurTime = new HCNetSDK.NET_DVR_TIME();
+        strCurTime.dwYear = Integer.parseInt(jTextFieldYear.getText());
+        strCurTime.dwMonth = Integer.parseInt(jTextFieldMonth.getText());
+        strCurTime.dwDay = Integer.parseInt(jTextFieldDay.getText());
+        strCurTime.dwHour = Integer.parseInt(jTextFieldHour.getText());
+        strCurTime.dwMinute = Integer.parseInt(jTextFieldMinute.getText());
+        strCurTime.dwSecond = Integer.parseInt(jTextFieldSecond.getText());
+        strCurTime.write();
+        Pointer lpPicConfig = strCurTime.getPointer();
+        boolean setDVRConfigSuc = hCNetSDK.NET_DVR_SetDVRConfig(m_lUserId, HCNetSDK.NET_DVR_SET_TIMECFG,
+                new NativeLong(0), lpPicConfig, strCurTime.size());
+        strCurTime.read();
+        if (setDVRConfigSuc != true)
+        {
+            JOptionPane.showMessageDialog(this, "校时失败");
+            return;
+        } else
+        {
+            JOptionPane.showMessageDialog(this, "校时成功");
+            return;
+        }
+
+    }//GEN-LAST:event_jToggleButtonCheckTimeActionPerformed
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JLabel jLabel6;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JTextField jTextFieldDay;
+    private javax.swing.JTextField jTextFieldHour;
+    private javax.swing.JTextField jTextFieldMinute;
+    private javax.swing.JTextField jTextFieldMonth;
+    private javax.swing.JTextField jTextFieldSecond;
+    private javax.swing.JTextField jTextFieldYear;
+    private javax.swing.JToggleButton jToggleButtonCheckTime;
+    private javax.swing.JToggleButton jToggleButtonExit;
+    // End of variables declaration//GEN-END:variables
+}

+ 253 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogDeviceState.form

@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane2">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTable" name="jTable2">
+          <Properties>
+            <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
+              <Table columnCount="4" rowCount="4">
+                <Column editable="true" title="Title 1" type="java.lang.Object"/>
+                <Column editable="true" title="Title 2" type="java.lang.Object"/>
+                <Column editable="true" title="Title 3" type="java.lang.Object"/>
+                <Column editable="true" title="Title 4" type="java.lang.Object"/>
+              </Table>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x8bbe;&#x5907;&#x72b6;&#x6001;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,-100,0,0,2,-94"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+    <Property name="useNullLayout" type="boolean" value="true"/>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanelChannelState">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x901a;&#x9053;&#x72b6;&#x6001;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="80" width="650" height="280"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Component id="jScrollPane1" pref="614" max="32767" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Component id="jScrollPane1" min="-2" pref="240" max="-2" attributes="0"/>
+                  <EmptySpace pref="11" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTable" name="jTableChannelState">
+              <Properties>
+                <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+                  <Connection code="this.initialChannelTableModel()" type="code"/>
+                </Property>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanelHDState">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x786c;&#x76d8;&#x72b6;&#x6001;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="360" width="650" height="270"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Component id="jScrollPane3" pref="614" max="32767" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Component id="jScrollPane3" min="-2" pref="236" max="-2" attributes="0"/>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane3">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTable" name="jTableHDState">
+              <Properties>
+                <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+                  <Connection code="this.initialHDTableModel()" type="code"/>
+                </Property>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x8bbe;&#x5907;&#x72b6;&#x6001;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="20" width="650" height="50"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="IP&#x5730;&#x5740;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="20" width="50" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8bbe;&#x5907;&#x72b6;&#x6001;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="230" y="20" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel4">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x603b;&#x94fe;&#x63a5;&#x8def;&#x6570;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="430" y="20" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldDeviceIP">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="100" y="20" width="100" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldDeviceState">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="310" y="20" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldTotalLink">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="510" y="20" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonRefresh">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x5237;&#x65b0;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonRefreshActionPerformed"/>
+      </Events>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="470" y="640" width="60" height="-1"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="570" y="640" width="60" height="-1"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+  </SubComponents>
+</Form>

+ 469 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogDeviceState.java

@@ -0,0 +1,469 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogDeviceState.java
+ *
+ * Created on 2009-10-30, 9:00:41
+ */
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import java.util.Vector;
+
+/*****************************************************************************
+ *类 :JDialogDeviceState
+ *类描述 :设备状态显示
+ ****************************************************************************/
+public class JDialogDeviceState extends javax.swing.JDialog
+{
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    private NativeLong m_lUserID;//用户句柄
+    private HCNetSDK.NET_DVR_WORKSTATE_V30 m_strWorkState;
+    private HCNetSDK.NET_DVR_IPPARACFG m_strIpparaCfg;
+    private HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;
+    private boolean[] bChannelEnabled;//用来获取对应通道号的通道是否有效
+    private int iTotlaLink;//总链接个数
+    private String m_sDeviceIP;
+
+    /*************************************************
+    函数:      JDialogDeviceState
+    函数描述:	构造函数   Creates new form JDialogDeviceState
+     *************************************************/
+    public JDialogDeviceState(java.awt.Frame parent, boolean modal, NativeLong lUserID, HCNetSDK.NET_DVR_DEVICEINFO_V30 strDeviceInfo, String sIP)
+    {
+        super(parent, modal);
+        m_lUserID = lUserID;
+        m_strDeviceInfo = strDeviceInfo;
+        bChannelEnabled = new boolean[HCNetSDK.MAX_ANALOG_CHANNUM];//默认初始值为false
+        iTotlaLink = 0;
+        m_sDeviceIP = sIP;
+        initComponents();
+        showState();
+    }
+
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jScrollPane2 = new javax.swing.JScrollPane();
+        jTable2 = new javax.swing.JTable();
+        jPanelChannelState = new javax.swing.JPanel();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        jTableChannelState = new javax.swing.JTable();
+        jPanelHDState = new javax.swing.JPanel();
+        jScrollPane3 = new javax.swing.JScrollPane();
+        jTableHDState = new javax.swing.JTable();
+        jPanel1 = new javax.swing.JPanel();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel4 = new javax.swing.JLabel();
+        jTextFieldDeviceIP = new javax.swing.JTextField();
+        jTextFieldDeviceState = new javax.swing.JTextField();
+        jTextFieldTotalLink = new javax.swing.JTextField();
+        jButtonRefresh = new javax.swing.JButton();
+        jButtonExit = new javax.swing.JButton();
+
+        jTable2.setModel(new javax.swing.table.DefaultTableModel(
+            new Object[][] {
+                {null, null, null, null},
+                {null, null, null, null},
+                {null, null, null, null},
+                {null, null, null, null}
+            },
+            new String[] {
+                "Title 1", "Title 2", "Title 3", "Title 4"
+            }
+        ));
+        jScrollPane2.setViewportView(jTable2);
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("设备状态");
+        getContentPane().setLayout(null);
+
+        jPanelChannelState.setBorder(javax.swing.BorderFactory.createTitledBorder("通道状态"));
+
+        jTableChannelState.setModel(this.initialChannelTableModel());
+        jScrollPane1.setViewportView(jTableChannelState);
+
+        javax.swing.GroupLayout jPanelChannelStateLayout = new javax.swing.GroupLayout(jPanelChannelState);
+        jPanelChannelState.setLayout(jPanelChannelStateLayout);
+        jPanelChannelStateLayout.setHorizontalGroup(
+            jPanelChannelStateLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelChannelStateLayout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 614, Short.MAX_VALUE)
+                .addContainerGap())
+        );
+        jPanelChannelStateLayout.setVerticalGroup(
+            jPanelChannelStateLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelChannelStateLayout.createSequentialGroup()
+                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 240, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(11, Short.MAX_VALUE))
+        );
+
+        getContentPane().add(jPanelChannelState);
+        jPanelChannelState.setBounds(10, 80, 650, 280);
+
+        jPanelHDState.setBorder(javax.swing.BorderFactory.createTitledBorder("硬盘状态"));
+
+        jTableHDState.setModel(this.initialHDTableModel());
+        jScrollPane3.setViewportView(jTableHDState);
+
+        javax.swing.GroupLayout jPanelHDStateLayout = new javax.swing.GroupLayout(jPanelHDState);
+        jPanelHDState.setLayout(jPanelHDStateLayout);
+        jPanelHDStateLayout.setHorizontalGroup(
+            jPanelHDStateLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelHDStateLayout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 614, Short.MAX_VALUE)
+                .addContainerGap())
+        );
+        jPanelHDStateLayout.setVerticalGroup(
+            jPanelHDStateLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelHDStateLayout.createSequentialGroup()
+                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        getContentPane().add(jPanelHDState);
+        jPanelHDState.setBounds(10, 360, 650, 270);
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("设备状态"));
+        jPanel1.setLayout(null);
+
+        jLabel2.setText("IP地址");
+        jPanel1.add(jLabel2);
+        jLabel2.setBounds(30, 20, 50, 15);
+
+        jLabel3.setText("设备状态");
+        jPanel1.add(jLabel3);
+        jLabel3.setBounds(230, 20, 60, 15);
+
+        jLabel4.setText("总链接路数");
+        jPanel1.add(jLabel4);
+        jLabel4.setBounds(430, 20, 70, 15);
+        jPanel1.add(jTextFieldDeviceIP);
+        jTextFieldDeviceIP.setBounds(100, 20, 100, 21);
+        jPanel1.add(jTextFieldDeviceState);
+        jTextFieldDeviceState.setBounds(310, 20, 70, 21);
+        jPanel1.add(jTextFieldTotalLink);
+        jTextFieldTotalLink.setBounds(510, 20, 70, 21);
+
+        getContentPane().add(jPanel1);
+        jPanel1.setBounds(10, 20, 650, 50);
+
+        jButtonRefresh.setText("刷新");
+        jButtonRefresh.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonRefreshActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jButtonRefresh);
+        jButtonRefresh.setBounds(470, 640, 60, 23);
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jButtonExit);
+        jButtonExit.setBounds(570, 640, 60, 23);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      "刷新"  按钮单击响应函数
+    函数描述:	刷新设备状态
+     *************************************************/
+ private void jButtonRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonRefreshActionPerformed
+     showState();
+ }//GEN-LAST:event_jButtonRefreshActionPerformed
+
+    /*************************************************
+    函数:      "退出"  按钮单击响应函数
+    函数描述:	销毁窗口
+     *************************************************/
+ private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
+     this.dispose();
+ }//GEN-LAST:event_jButtonExitActionPerformed
+
+    /*************************************************
+    函数:      initialChannelTableModel
+    函数描述:	初始化通道状态列表
+     *************************************************/
+    public DefaultTableModel initialChannelTableModel()
+    {
+        String tabeTile[];
+        tabeTile = new String[]
+                {
+                    "通道号", "录像状态", "信号状态", "硬件状态", "连接数", "当前码率(bps)", "IPC链接数"
+                };
+        DefaultTableModel channelTableModel = new DefaultTableModel(tabeTile, 0);
+        return channelTableModel;
+    }
+
+    /*************************************************
+    函数:      initialHDTableModel
+    函数描述:	初始化硬盘状态列表
+     *************************************************/
+    public DefaultTableModel initialHDTableModel()
+    {
+        String tabeTile[];
+        tabeTile = new String[]
+                {
+                    "硬盘号", "硬盘容量(MB)", "剩余空间(MB)", "硬盘状态"
+                };
+        DefaultTableModel HDTableModel = new DefaultTableModel(tabeTile, 0);
+        return HDTableModel;
+    }
+
+    /*************************************************
+    函数:      showState
+    函数描述:	调用接口获取设备状态并显示
+     *************************************************/
+    private void showState()
+    {
+        ((DefaultTableModel) jTableChannelState.getModel()).getDataVector().removeAllElements();//清空通道状态列表
+        ((DefaultTableModel) jTableHDState.getModel()).getDataVector().removeAllElements();//清空硬盘状态列表
+        iTotlaLink = 0;//清空总链接数目
+
+        m_strWorkState = new HCNetSDK.NET_DVR_WORKSTATE_V30();//调用接口获取设备工作状态
+        boolean getDVRConfigSuc = hCNetSDK.NET_DVR_GetDVRWorkState_V30(m_lUserID, m_strWorkState);
+        if (getDVRConfigSuc != true)
+        {
+            System.out.println(hCNetSDK.NET_DVR_GetLastError());
+            JOptionPane.showMessageDialog(this, "获取设备状态失败");
+        }
+
+        IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
+        getDVRConfigSuc = false;
+        m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG();
+        m_strIpparaCfg.write();
+        Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
+        getDVRConfigSuc = hCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
+        m_strIpparaCfg.read();
+        if (getDVRConfigSuc != true)
+        {//设备不支持,则表示没有IP通道
+            for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++)
+            {
+                bChannelEnabled[iChannum] = true;
+            }
+        } else
+        {//包含IP通道
+            for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++)
+            {
+                bChannelEnabled[iChannum] = (m_strIpparaCfg.byAnalogChanEnable[iChannum] == 1) ? true : false;
+            }
+        }
+
+        //显示设备IP;
+        jTextFieldDeviceIP.setText(m_sDeviceIP);
+
+        //显示设备状态
+        switch (m_strWorkState.dwDeviceStatic)
+        {
+            case 0:
+                jTextFieldDeviceState.setText("正常");
+                break;
+            case 1:
+                jTextFieldDeviceState.setText("CPU占用率太高,超过85%");
+                break;
+            case 2:
+                jTextFieldDeviceState.setText("硬件错误");
+                break;
+            default:
+                jTextFieldDeviceState.setText("未知");
+                break;
+        }
+
+        //显示模拟通道状态
+        for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++)
+        {
+            DefaultTableModel channelTableModel = ((DefaultTableModel) jTableChannelState.getModel());//获取表格模型
+            Vector<String> newRow = new Vector<String>();
+            if (bChannelEnabled[iChannum] == true)
+            { //通道有效
+                newRow.add("Camera" + (iChannum + m_strDeviceInfo.byStartChan));//添加模拟通道号
+
+                //是否录像
+                if (0 == m_strWorkState.struChanStatic[iChannum].byRecordStatic)
+                {
+                    newRow.add("不录像");
+                } else
+                {
+                    if (1 == m_strWorkState.struChanStatic[iChannum].byRecordStatic)
+                    {
+                        newRow.add("录像");
+                    }
+                }
+                //信号状态
+                if (0 == m_strWorkState.struChanStatic[iChannum].bySignalStatic)
+                {
+                    newRow.add("正常");
+                } else
+                {
+                    if (1 == m_strWorkState.struChanStatic[iChannum].bySignalStatic)
+                    {
+                        newRow.add("信号丢失");
+                    }
+                }
+                //硬件状态
+                if (0 == m_strWorkState.struChanStatic[iChannum].byHardwareStatic)
+                {
+                    newRow.add("正常");
+                } else
+                {
+                    if (1 == m_strWorkState.struChanStatic[iChannum].byHardwareStatic)
+                    {
+                        newRow.add("异常");
+                    }
+                }
+                //连接数
+                newRow.add(m_strWorkState.struChanStatic[iChannum].dwLinkNum + "");
+                //此处增加总连接数
+                iTotlaLink += m_strWorkState.struChanStatic[iChannum].dwLinkNum;
+                //当前码率
+                newRow.add(m_strWorkState.struChanStatic[iChannum].dwBitRate + "");
+                //IPC连接数
+                newRow.add(m_strWorkState.struChanStatic[iChannum].dwIPLinkNum + "");
+            } else
+            {
+                continue;
+            }
+            channelTableModel.getDataVector().add(newRow);
+            ((DefaultTableModel) jTableHDState.getModel()).fireTableStructureChanged();
+        }
+
+        //显示IP通道状态
+        //首先获取IP参数,如果IP参数对应通道参数的byEnable为有效,则该通道有效,
+        //再从工作参数结构体中取得相关状态参数,模拟通道号:0-31,IP通道号.32-64
+        for (int iChannum = 0; iChannum < 32; iChannum++)
+        {
+            DefaultTableModel channelTableModel = ((DefaultTableModel) jTableChannelState.getModel());//获取表格模型
+            Vector<String> newRow = new Vector<String>();
+            if (m_strIpparaCfg.struIPChanInfo[iChannum].byEnable == 1)
+            {//判断对应IP通道是否有效
+                newRow.add("IPCamera" + (iChannum + 1));//添加IP通道号
+                //是否录像参数
+                if (0 == m_strWorkState.struChanStatic[32 + iChannum].byRecordStatic)
+                {
+                    newRow.add("不录像");
+                } else
+                {
+                    if (1 == m_strWorkState.struChanStatic[32 + iChannum].byRecordStatic)
+                    {
+                        newRow.add("录像");
+                    }
+                }
+                //信号状态
+                if (0 == m_strWorkState.struChanStatic[32 + iChannum].bySignalStatic)
+                {
+                    newRow.add("正常");
+                } else
+                {
+                    if (1 == m_strWorkState.struChanStatic[32 + iChannum].bySignalStatic)
+                    {
+                        newRow.add("信号丢失");
+                    }
+                }
+                //硬件状态
+                if (0 == m_strWorkState.struChanStatic[32 + iChannum].byHardwareStatic)
+                {
+                    newRow.add("正常");
+                } else
+                {
+                    if (1 == m_strWorkState.struChanStatic[32 + iChannum].byHardwareStatic)
+                    {
+                        newRow.add("异常");
+                    }
+                }
+                //连接数
+                newRow.add(m_strWorkState.struChanStatic[32 + iChannum].dwLinkNum + "");
+                //此处增加总连接数
+                iTotlaLink += m_strWorkState.struChanStatic[32 + iChannum].dwLinkNum;
+                //当前码率
+                newRow.add(m_strWorkState.struChanStatic[32 + iChannum].dwBitRate + "");
+                //IPC连接数
+                newRow.add(m_strWorkState.struChanStatic[32 + iChannum].dwIPLinkNum + "");
+                channelTableModel.getDataVector().add(newRow);
+                ((DefaultTableModel) jTableHDState.getModel()).fireTableStructureChanged();
+            }
+        }
+
+        //显示总链接数
+        jTextFieldTotalLink.setText(iTotlaLink + "");
+
+        //显示硬盘状态
+        for (int i = 0; i < HCNetSDK.MAX_DISKNUM_V30; i++)
+        {
+            DefaultTableModel HDTableModel = ((DefaultTableModel) jTableHDState.getModel());//获取表格模型
+            Vector<String> newRow = new Vector<String>();
+
+            newRow.add("硬盘" + (i + 1));//添加硬盘号
+            newRow.add(m_strWorkState.struHardDiskStatic[i].dwVolume + "");//添加硬盘容量
+            newRow.add(m_strWorkState.struHardDiskStatic[i].dwFreeSpace + "");//添加硬盘剩余空间
+            if (m_strWorkState.struHardDiskStatic[i].dwVolume != 0)
+            {//添加硬盘状态
+                switch (m_strWorkState.struHardDiskStatic[i].dwHardDiskStatic)
+                {
+                    case 0:
+                        newRow.add("活动");
+                        break;
+                    case 1:
+                        newRow.add("休眠");
+                        break;
+                    case 2:
+                        newRow.add("不正常");
+                        break;
+
+                    default:
+                        break;
+                }
+            } else
+            {
+                newRow.add("");//添加文件名信息
+            }
+            HDTableModel.getDataVector().add(newRow);
+            ((DefaultTableModel) jTableHDState.getModel()).fireTableStructureChanged();
+        }
+
+        jTableChannelState.repaint();
+        jTableHDState.repaint();
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JButton jButtonRefresh;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JPanel jPanelChannelState;
+    private javax.swing.JPanel jPanelHDState;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JScrollPane jScrollPane2;
+    private javax.swing.JScrollPane jScrollPane3;
+    private javax.swing.JTable jTable2;
+    private javax.swing.JTable jTableChannelState;
+    private javax.swing.JTable jTableHDState;
+    private javax.swing.JTextField jTextFieldDeviceIP;
+    private javax.swing.JTextField jTextFieldDeviceState;
+    private javax.swing.JTextField jTextFieldTotalLink;
+    // End of variables declaration//GEN-END:variables
+}

+ 154 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogFormatDisk.form

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x683c;&#x5f0f;&#x5316;&#x786c;&#x76d8;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="1" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" pref="154" max="32767" attributes="0"/>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Component id="jComboBoxDisk" min="-2" pref="99" max="-2" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Component id="jLabel3" pref="203" max="32767" attributes="0"/>
+                          <EmptySpace min="-2" pref="41" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jButtonFormat" linkSize="1" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace pref="144" max="32767" attributes="0"/>
+                          <Component id="jButtonExit" linkSize="1" min="-2" pref="67" max="-2" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jProgressBar" pref="282" max="32767" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="1"/>
+                      <Component id="jComboBoxDisk" alignment="3" min="-2" pref="18" max="-2" attributes="1"/>
+                  </Group>
+                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Component id="jProgressBar" min="-2" pref="11" max="-2" attributes="0"/>
+                  <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jButtonFormat" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jButtonExit" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace pref="7" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JButton" name="jButtonFormat">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x683c;&#x5f0f;&#x5316;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonFormatActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxDisk">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="0"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x76d8;&#x7b26;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="0"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JProgressBar" name="jProgressBar">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8fdb;&#x5ea6;:"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonExit">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+          </Events>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

+ 299 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogFormatDisk.java

@@ -0,0 +1,299 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogFormatDisk.java
+ *
+ * Created on 2009-10-9, 16:15:51
+ */
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
+import com.sun.jna.ptr.NativeLongByReference;
+
+import javax.swing.*;
+import java.util.concurrent.TimeUnit;
+
+/*****************************************************************************
+ *类 :JDialogFormatDisk
+ *类描述 :格式化硬盘
+ ****************************************************************************/
+public class JDialogFormatDisk extends javax.swing.JDialog
+{
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    private NativeLong m_lUserId;
+    private NativeLong m_lFormatHandle;
+    private HCNetSDK.NET_DVR_HDCFG m_struHDCfg;
+
+    /*************************************************
+    函数:      JDialogFormatDisk
+    函数描述:	构造函数   Creates new form JDialogFormatDisk
+     *************************************************/
+    public JDialogFormatDisk(java.awt.Frame parent, boolean modal, NativeLong userId)
+    {
+        super(parent, modal);
+        initComponents();
+        jProgressBar.setMinimum(0);
+        jProgressBar.setMaximum(100);
+
+        m_lUserId = userId;
+        m_lFormatHandle = new NativeLong(-1);
+        m_struHDCfg = new HCNetSDK.NET_DVR_HDCFG();
+        m_struHDCfg.write();
+        Pointer lpPicConfig = m_struHDCfg.getPointer();
+        IntByReference ibrBytesReturned = new IntByReference(0);
+        boolean getDVRConfigSuc = hCNetSDK.NET_DVR_GetDVRConfig(m_lUserId, HCNetSDK.NET_DVR_GET_HDCFG,
+                new NativeLong(0), lpPicConfig, m_struHDCfg.size(), ibrBytesReturned);
+        m_struHDCfg.read();
+        if (getDVRConfigSuc != true)
+        {
+            System.out.println("获取硬盘信息失败");
+        } else
+        {
+            jComboBoxDisk.addItem("全部硬盘");
+            for (int i = 0; i < m_struHDCfg.dwHDCount; i++)
+            {
+                String s = "硬盘" + m_struHDCfg.struHDInfo[i].dwHDNo;
+                jComboBoxDisk.addItem(s);
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel1 = new javax.swing.JPanel();
+        jButtonFormat = new javax.swing.JButton();
+        jComboBoxDisk = new javax.swing.JComboBox();
+        jLabel1 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jProgressBar = new javax.swing.JProgressBar();
+        jLabel2 = new javax.swing.JLabel();
+        jButtonExit = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("格式化硬盘");
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
+
+        jButtonFormat.setText("格式化");
+        jButtonFormat.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonFormatActionPerformed(evt);
+            }
+        });
+
+        jLabel1.setText("盘符");
+
+        jLabel3.setText("0");
+
+        jLabel2.setText("进度:");
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jLabel1)
+                        .addGap(18, 18, 18)
+                        .addComponent(jComboBoxDisk, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addContainerGap())
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jLabel2)
+                        .addGap(18, 18, 18)
+                        .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
+                        .addGap(41, 41, 41))
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jButtonFormat)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 144, Short.MAX_VALUE)
+                        .addComponent(jButtonExit, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addContainerGap())
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE)
+                        .addContainerGap())))
+        );
+
+        jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButtonExit, jButtonFormat});
+
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addGap(18, 18, 18)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel1)
+                    .addComponent(jComboBoxDisk, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(18, 18, 18)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel2)
+                    .addComponent(jLabel3))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addComponent(jProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGap(18, 18, 18)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jButtonFormat)
+                    .addComponent(jButtonExit))
+                .addContainerGap(7, Short.MAX_VALUE))
+        );
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE)
+                .addContainerGap())
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      "格式化"按钮响应函数
+    函数描述:	调用接口格式化硬盘
+     *************************************************/
+    private void jButtonFormatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonFormatActionPerformed
+        NativeLongByReference pCurrentFormatDisk = new NativeLongByReference(new NativeLong(-1));
+        NativeLongByReference pCurrentDiskPos = new NativeLongByReference(new NativeLong(-1));
+        NativeLongByReference pFormatStatic = new NativeLongByReference(new NativeLong(-1));
+        int iDiskNumber = jComboBoxDisk.getSelectedIndex();
+        if (iDiskNumber == 0)
+        {
+            m_lFormatHandle = hCNetSDK.NET_DVR_FormatDisk(m_lUserId, new NativeLong(0xff));//0xFF表示所有硬盘
+            if (m_lFormatHandle.intValue() < 0)
+            {
+                int err = hCNetSDK.NET_DVR_GetLastError();
+                if (err == HCNetSDK.NET_DVR_DISK_FORMATING)
+                {
+                    JOptionPane.showMessageDialog(this, "硬盘正在格式化,不能启动操作");
+                } else
+                {
+                    JOptionPane.showMessageDialog(this, "格式化失败");
+                }
+            } else
+            {
+                System.out.println("正在格式化!");
+                do
+                {
+                    hCNetSDK.NET_DVR_GetFormatProgress(m_lFormatHandle, pCurrentFormatDisk, pCurrentDiskPos, pFormatStatic);
+                    System.out.println("正在格式化硬盘:" + pCurrentFormatDisk.getValue().intValue());//正在格式化的硬盘号
+                    jProgressBar.setValue(pCurrentDiskPos.getValue().intValue());
+                    try
+                    {//等待500ms
+                        TimeUnit.MILLISECONDS.sleep(500);
+                    } catch (InterruptedException e)
+                    {
+                    }
+                } while (pFormatStatic.getValue().intValue() == 0);//正在格式化
+                System.out.println("static" + pFormatStatic.getValue().intValue());
+                if (pFormatStatic.getValue().intValue() == 2)
+                {
+                    JOptionPane.showMessageDialog(this, "格式化出错!");
+                    return;
+                }
+                if (pFormatStatic.getValue().intValue() == 3)
+                {
+                    JOptionPane.showMessageDialog(this, "网络异常!");
+                    return;
+                }
+                if (pFormatStatic.getValue().intValue() == 3)
+                {
+                    JOptionPane.showMessageDialog(this, "格式化完成!");
+                    return;
+                }
+            }
+        } else
+        {//格式化单个硬盘
+            m_lFormatHandle = hCNetSDK.NET_DVR_FormatDisk(m_lUserId, new NativeLong(m_struHDCfg.struHDInfo[iDiskNumber - 1].dwHDNo));
+            if (m_lFormatHandle.intValue() < 0)
+            {
+                int err = hCNetSDK.NET_DVR_GetLastError();
+                if (err == HCNetSDK.NET_DVR_DISK_FORMATING)
+                {
+                    JOptionPane.showMessageDialog(this, "硬盘正在格式化,不能启动操作");
+                } else
+                {
+                    System.out.println(err);
+                    JOptionPane.showMessageDialog(this, "格式化失败");
+                }
+            } else
+            {
+                System.out.println("正在格式化!");
+                do
+                {
+                    hCNetSDK.NET_DVR_GetFormatProgress(m_lFormatHandle, pCurrentFormatDisk, pCurrentDiskPos, pFormatStatic);
+                    jProgressBar.setValue(pCurrentDiskPos.getValue().intValue());
+                    try
+                    {//等待500ms
+                        TimeUnit.MILLISECONDS.sleep(500);
+                    } catch (InterruptedException e)
+                    {
+                    }
+                } while (pFormatStatic.getValue().intValue() == 0);//正在格式化
+
+                if (pFormatStatic.getValue().intValue() == 2)
+                {
+                    JOptionPane.showMessageDialog(this, "格式化出错!");
+                    return;
+                }
+                if (pFormatStatic.getValue().intValue() == 3)
+                {
+                    JOptionPane.showMessageDialog(this, "网络异常!");
+                    return;
+                }
+                if (pFormatStatic.getValue().intValue() == 3)
+                {
+                    JOptionPane.showMessageDialog(this, "格式化完成!");
+                    return;
+                }
+            }
+        }
+
+    }//GEN-LAST:event_jButtonFormatActionPerformed
+
+    /*************************************************
+    函数:      "退出"  按钮响应函数
+    函数描述:	销毁窗口
+     *************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
+        this.dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JButton jButtonFormat;
+    private javax.swing.JComboBox jComboBoxDisk;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JProgressBar jProgressBar;
+    // End of variables declaration//GEN-END:variables
+}

+ 916 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogHideAlarm.form

@@ -0,0 +1,916 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="1" attributes="0">
+                      <Component id="jButtonSave" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="203" max="-2" attributes="0"/>
+                      <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="28" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="panelPlay" min="-2" pref="352" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jPanel1" min="-2" max="-2" attributes="1"/>
+                          <Component id="jPanel3" max="32767" attributes="1"/>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="jPanel4" max="32767" attributes="1"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="jPanel1" min="-2" pref="89" max="-2" attributes="0"/>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="jPanel3" max="32767" attributes="0"/>
+                  </Group>
+                  <Component id="panelPlay" alignment="0" min="-2" pref="288" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace min="-2" pref="2" max="-2" attributes="0"/>
+              <Component id="jPanel4" min="-2" pref="176" max="-2" attributes="0"/>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jButtonSave" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jButtonExit" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="java.awt.Panel" name="panelPlay">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="cc" type="rgb"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="panelPlayMousePressed"/>
+        <EventHandler event="mouseDragged" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="panelPlayMouseDragged"/>
+      </Events>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x533a;&#x57df;&#x8bbe;&#x7f6e;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxGetHideAlarmArea" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Group type="102" alignment="0" attributes="0">
+                          <EmptySpace min="21" pref="21" max="21" attributes="0"/>
+                          <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jComboBoxSensitive" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxSetHideAlarmArea" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jCheckBoxGetHideAlarmArea" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxSetHideAlarmArea" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="8" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jComboBoxSensitive" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxGetHideAlarmArea">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x663e;&#x793a;&#x906e;&#x6321;&#x62a5;&#x8b66;&#x533a;&#x57df;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jCheckBoxGetHideAlarmAreaActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxSetHideAlarmArea">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8bbe;&#x7f6e;&#x906e;&#x6321;&#x62a5;&#x8b66;&#x533a;&#x57df;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jCheckBoxSetHideAlarmAreaActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x7075;&#x654f;&#x5ea6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxSensitive">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="3">
+                <StringItem index="0" value="&#x4f4e;&#x7075;&#x654f;&#x5ea6;"/>
+                <StringItem index="1" value="&#x4e2d;&#x7075;&#x654f;&#x5ea6;"/>
+                <StringItem index="2" value="&#x9ad8;&#x7075;&#x654f;&#x5ea6;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel3">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x62a5;&#x8b66;&#x5904;&#x7406;&#x65b9;&#x5f0f;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxMonitorAlarm" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxCenter" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxJPEG" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxAudioAlarm" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="28" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxAlarmout" min="-2" max="-2" attributes="0"/>
+                      <Component id="jScrollPane2" min="-2" pref="116" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace pref="15" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace min="-2" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jCheckBoxMonitorAlarm" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxAlarmout" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Component id="jCheckBoxAudioAlarm" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace min="-2" pref="2" max="-2" attributes="0"/>
+                  <Component id="jCheckBoxCenter" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Component id="jCheckBoxJPEG" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace pref="62" max="32767" attributes="0"/>
+              </Group>
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace pref="34" max="32767" attributes="0"/>
+                  <Component id="jScrollPane2" min="-2" pref="120" max="-2" attributes="1"/>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxMonitorAlarm">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x76d1;&#x89c6;&#x5668;&#x8b66;&#x544a;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxCenter">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x4e0a;&#x4f20;&#x4e2d;&#x5fc3;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxAudioAlarm">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x58f0;&#x97f3;&#x8b66;&#x544a;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxJPEG">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Email JPEG"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxAlarmout">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x89e6;&#x53d1;&#x62a5;&#x8b66;&#x8f93;&#x51fa;"/>
+          </Properties>
+        </Component>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane2">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JList" name="jListTraggerAlarmOut">
+              <Properties>
+                <Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel4">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x5e03;&#x9632;&#x65f6;&#x95f4;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                              <Component id="jLabel9" alignment="0" pref="54" max="32767" attributes="1"/>
+                              <Component id="jLabel8" alignment="0" max="32767" attributes="1"/>
+                              <Component id="jLabel10" alignment="0" max="32767" attributes="1"/>
+                              <Component id="jLabel16" alignment="0" min="-2" max="-2" attributes="1"/>
+                          </Group>
+                          <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour1" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel18" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin1" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour2" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel36" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin2" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour3" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel40" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin3" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour4" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel44" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin4" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jLabel17" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Component id="jLabel35" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Component id="jLabel39" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Component id="jLabel43" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="1">
+                          <Component id="jLabel7" min="-2" pref="50" max="-2" attributes="0"/>
+                          <EmptySpace max="32767" attributes="0"/>
+                          <Component id="jComboBoxDate" min="-2" pref="90" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour1" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel15" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin1" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel19" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour2" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel34" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin2" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel33" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour3" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel38" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin3" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel37" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour4" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel42" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin4" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel41" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                      <Component id="jLabel11" alignment="0" pref="52" max="32767" attributes="1"/>
+                      <Component id="jLabel12" alignment="0" max="32767" attributes="1"/>
+                      <Component id="jLabel13" alignment="0" max="32767" attributes="1"/>
+                      <Component id="jLabel14" alignment="0" min="-2" max="-2" attributes="1"/>
+                  </Group>
+                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour5" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel48" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin5" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel47" min="-2" pref="30" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour6" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel52" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin6" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel51" min="-2" pref="30" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInEndHour5" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel46" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInEndHour6" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel50" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInBeginHour7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel53" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInBeginMin7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel54" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndHour7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel56" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInBeginHour8" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel59" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInBeginMin8" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel60" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndHour8" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel58" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndMin5" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin6" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin7" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin8" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jLabel45" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jLabel57" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <EmptySpace max="-2" attributes="0"/>
+                                  <Component id="jButtonConfirm" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Component id="jLabel55" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jLabel49" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                  </Group>
+                  <EmptySpace pref="11" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel7" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jComboBoxDate" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour1" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel15" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin1" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel19" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour2" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel34" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin2" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel33" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour3" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel38" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin3" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel37" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour4" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel42" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin4" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel41" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabel17" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel35" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel39" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel43" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour1" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel18" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin1" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour2" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel36" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin2" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour3" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel40" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin3" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour4" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel44" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin4" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabel16" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel10" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel9" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel8" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jLabel11" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                                  <Component id="jLabel12" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour5" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel46" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                                  <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour6" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel50" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInBeginHour5" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel48" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin5" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel47" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                                  <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInBeginHour6" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel52" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin6" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel51" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                          </Group>
+                          <EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jLabel13" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                                  <Component id="jLabel14" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour7" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel56" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginHour7" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel53" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin7" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel54" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                                  <EmptySpace max="-2" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour8" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel58" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginHour8" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel59" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin8" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel60" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                          </Group>
+                      </Group>
+                      <Component id="jLabel45" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndMin5" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="jTextFieldInEndMin6" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel49" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="jTextFieldInEndMin7" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel55" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="jTextFieldInEndMin8" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel57" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jButtonConfirm" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                  </Group>
+                  <EmptySpace min="-2" pref="33" max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel8">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;4"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel9">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;3"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel10">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;2"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel11">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;5"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel12">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;6"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel13">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;7"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel14">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;8"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel16">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;1"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin1">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour1">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin1">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour1">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel15">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel17">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel18">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel19">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel33">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel34">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel35">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel36">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel37">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel38">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel39">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel40">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel41">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel42">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel43">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel44">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel45">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel46">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel47">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel48">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel49">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin6">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel50">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour6">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel51">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin6">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel52">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour6">
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonConfirm">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x786e;&#x5b9a;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonConfirmActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel53">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour7">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel54">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin7">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin7">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel55">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour7">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel56">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour8">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel57">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel58">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin8">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel59">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour8">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel60">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin8">
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxDate">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="7">
+                <StringItem index="0" value="&#x661f;&#x671f;&#x4e00;"/>
+                <StringItem index="1" value="&#x661f;&#x671f;&#x4e8c;"/>
+                <StringItem index="2" value="&#x661f;&#x671f;&#x4e09;"/>
+                <StringItem index="3" value="&#x661f;&#x671f;&#x56db;"/>
+                <StringItem index="4" value="&#x661f;&#x671f;&#x4e94;"/>
+                <StringItem index="5" value="&#x661f;&#x671f;&#x516d;"/>
+                <StringItem index="6" value="&#x661f;&#x671f;&#x65e5;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jComboBoxDateActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel7">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65e5;&#x671f;"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonSave">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x786e;&#x5b9a;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSaveActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

File diff suppressed because it is too large
+ 1250 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogHideAlarm.java


+ 119 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogHideArea.form

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x906e;&#x6321;&#x533a;&#x57df;&#x914d;&#x7f6e;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                      <Component id="jRadioButtonShowArea" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="81" max="-2" attributes="0"/>
+                      <Component id="jRadioButtonSetArea" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Component id="panelPlay" alignment="0" min="-2" pref="352" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="18" max="32767" attributes="0"/>
+          </Group>
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace min="-2" pref="34" max="-2" attributes="0"/>
+              <Component id="jButtonSet" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="169" max="32767" attributes="0"/>
+              <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+              <EmptySpace min="-2" pref="63" max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="panelPlay" min="-2" pref="288" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jRadioButtonShowArea" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jRadioButtonSetArea" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jButtonSet" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jButtonExit" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="java.awt.Panel" name="panelPlay">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="cc" type="rgb"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="panelPlayMousePressed"/>
+        <EventHandler event="mouseDragged" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="panelPlayMouseDragged"/>
+      </Events>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonSet">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x8bbe;&#x7f6e;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSetActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JRadioButton" name="jRadioButtonShowArea">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x663e;&#x793a;&#x906e;&#x76d6;&#x533a;&#x57df;"/>
+        <Property name="enabled" type="boolean" value="false"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jRadioButtonShowAreaActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JRadioButton" name="jRadioButtonSetArea">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x8bbe;&#x7f6e;&#x906e;&#x76d6;&#x533a;&#x57df;"/>
+        <Property name="enabled" type="boolean" value="false"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jRadioButtonSetAreaActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

+ 447 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogHideArea.java

@@ -0,0 +1,447 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogHideArea.java
+ *
+ * Created on 2009-12-8, 15:13:56
+ */
+
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.Native;
+import com.sun.jna.NativeLong;
+import com.sun.jna.examples.win32.GDI32.RECT;
+import com.sun.jna.examples.win32.W32API;
+import com.sun.jna.examples.win32.W32API.HANDLE;
+import com.sun.jna.examples.win32.W32API.HWND;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/*****************************************************************************
+ *类 :JDialogHideArea
+ *类描述 :遮挡区域设置
+ ****************************************************************************/
+public class JDialogHideArea extends javax.swing.JDialog {
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    static GDI32 gDi = GDI32.INSTANCE;
+    static USER32 uSer = USER32.INSTANCE;
+
+    NativeLong m_lUserID;//用户ID
+    int	m_iChanShowNum;//父窗口传来的通道号,预览此通道
+    NativeLong m_lPlayHandle;//预览句柄
+
+    FDrawFunSet ShelterAreaSetCallBack;//设置遮挡区域的回调函数
+    FDrawFunGet ShelterAreaGetCallBack;//显示遮挡区域的回调函数
+
+    HCNetSDK.NET_DVR_CLIENTINFO m_strClientInfo;//预览参数
+    HCNetSDK.NET_DVR_PICCFG_V30 m_struPicCfg;//主窗口传来的图像参数结构体指针
+
+     boolean m_bDrawdetect;
+     int g_iHideAreaCount = 4;//mask area number
+     RECT[] g_rectHideAreaShow = new RECT[HCNetSDK.MAX_SHELTERNUM];//display mask area
+     RECT[] g_rectHideAreaMouse = new RECT[HCNetSDK.MAX_SHELTERNUM];//set mask area
+
+
+    /*************************************************
+    函数:      JDialogHideArea
+    函数描述:  构造函数   Creates new form JDialogHideArea
+     *************************************************/
+    public JDialogHideArea(javax.swing.JDialog parent, boolean modal, NativeLong lUserID, int iChannelNum, HCNetSDK.NET_DVR_PICCFG_V30 struPicCfg)
+    {
+        super(parent, modal);
+        initComponents();
+        m_lUserID = lUserID;
+        m_iChanShowNum = iChannelNum;
+        m_struPicCfg = struPicCfg;
+        m_lPlayHandle = new NativeLong(-1);
+        ShelterAreaSetCallBack = new FDrawFunSet();
+        ShelterAreaGetCallBack = new FDrawFunGet();
+        initialDialog();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        panelPlay = new java.awt.Panel();
+        jButtonSet = new javax.swing.JButton();
+        jButtonExit = new javax.swing.JButton();
+        jRadioButtonShowArea = new javax.swing.JRadioButton();
+        jRadioButtonSetArea = new javax.swing.JRadioButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("遮挡区域配置");
+
+        panelPlay.setBackground(new java.awt.Color(204, 255, 255));
+        panelPlay.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mousePressed(java.awt.event.MouseEvent evt) {
+                panelPlayMousePressed(evt);
+            }
+        });
+        panelPlay.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
+            public void mouseDragged(java.awt.event.MouseEvent evt) {
+                panelPlayMouseDragged(evt);
+            }
+        });
+        panelPlay.setLayout(null);
+
+        jButtonSet.setText("设置");
+        jButtonSet.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonSetActionPerformed(evt);
+            }
+        });
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+
+        jRadioButtonShowArea.setText("显示遮盖区域");
+        jRadioButtonShowArea.setEnabled(false);
+        jRadioButtonShowArea.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jRadioButtonShowAreaActionPerformed(evt);
+            }
+        });
+
+        jRadioButtonSetArea.setText("设置遮盖区域");
+        jRadioButtonSetArea.setEnabled(false);
+        jRadioButtonSetArea.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jRadioButtonSetAreaActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(10, 10, 10)
+                        .addComponent(jRadioButtonShowArea)
+                        .addGap(81, 81, 81)
+                        .addComponent(jRadioButtonSetArea))
+                    .addComponent(panelPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 352, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap(18, Short.MAX_VALUE))
+            .addGroup(layout.createSequentialGroup()
+                .addGap(34, 34, 34)
+                .addComponent(jButtonSet)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 169, Short.MAX_VALUE)
+                .addComponent(jButtonExit)
+                .addGap(63, 63, 63))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(panelPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 288, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jRadioButtonShowArea)
+                    .addComponent(jRadioButtonSetArea))
+                .addGap(18, 18, 18)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jButtonSet)
+                    .addComponent(jButtonExit))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      "设置"  按钮响应函数
+    函数描述:   保存遮挡区域设置到结构体
+     *************************************************/
+    private void jButtonSetActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonSetActionPerformed
+    {//GEN-HEADEREND:event_jButtonSetActionPerformed
+       	int k = 0;
+	for (k = 0; k < HCNetSDK.MAX_SHELTERNUM; k++)
+	{
+		m_struPicCfg.struShelter[k].wHideAreaTopLeftX = 0;
+		m_struPicCfg.struShelter[k].wHideAreaTopLeftY = 0;
+		m_struPicCfg.struShelter[k].wHideAreaWidth = 0;
+		m_struPicCfg.struShelter[k].wHideAreaHeight = 0;
+	}
+	for (k = 0; k<g_iHideAreaCount; k++)
+	{
+		if (g_rectHideAreaMouse[k].top <= g_rectHideAreaMouse[k].bottom)
+		{
+			if (g_rectHideAreaMouse[k].left <= g_rectHideAreaMouse[k].right)
+			{
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftX = (short)(g_rectHideAreaMouse[k].left*2);
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftY = (short)(g_rectHideAreaMouse[k].top*2);
+				m_struPicCfg.struShelter[k].wHideAreaWidth = (short)((g_rectHideAreaMouse[k].right-g_rectHideAreaMouse[k].left)*2);
+				m_struPicCfg.struShelter[k].wHideAreaHeight = (short)((g_rectHideAreaMouse[k].bottom-g_rectHideAreaMouse[k].top)*2);
+			}
+			else
+			{
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftX = (short)(g_rectHideAreaMouse[k].right*2);
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftY = (short)(g_rectHideAreaMouse[k].top*2);
+				m_struPicCfg.struShelter[k].wHideAreaWidth = (short)((g_rectHideAreaMouse[k].left-g_rectHideAreaMouse[k].right)*2);
+				m_struPicCfg.struShelter[k].wHideAreaHeight = (short)((g_rectHideAreaMouse[k].bottom-g_rectHideAreaMouse[k].top)*2);
+			}
+		}
+		else
+		{
+			if (g_rectHideAreaMouse[k].left <= g_rectHideAreaMouse[k].right)
+			{
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftX = (short)(g_rectHideAreaMouse[k].left*2);
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftY = (short)(g_rectHideAreaMouse[k].bottom*2);
+				m_struPicCfg.struShelter[k].wHideAreaWidth = (short)((g_rectHideAreaMouse[k].right-g_rectHideAreaMouse[k].left)*2);
+				m_struPicCfg.struShelter[k].wHideAreaHeight = (short)((g_rectHideAreaMouse[k].top-g_rectHideAreaMouse[k].bottom)*2);
+			}
+			else
+			{
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftX = (short)(g_rectHideAreaMouse[k].right*2);
+				m_struPicCfg.struShelter[k].wHideAreaTopLeftY = (short)(g_rectHideAreaMouse[k].bottom*2);
+				m_struPicCfg.struShelter[k].wHideAreaWidth = (short)((g_rectHideAreaMouse[k].left-g_rectHideAreaMouse[k].right)*2);
+				m_struPicCfg.struShelter[k].wHideAreaHeight = (short)((g_rectHideAreaMouse[k].top-g_rectHideAreaMouse[k].bottom)*2);
+			}
+		}
+	}
+    }//GEN-LAST:event_jButtonSetActionPerformed
+
+    /*************************************************
+    函数:      "显示遮盖区域"  按钮响应函数
+    函数描述:   保存遮挡区域设置到结构体
+     *************************************************/
+    private void jRadioButtonShowAreaActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jRadioButtonShowAreaActionPerformed
+    {//GEN-HEADEREND:event_jRadioButtonShowAreaActionPerformed
+       if (m_lPlayHandle.intValue() < 0)
+		return;
+	if (jRadioButtonSetArea.isSelected())
+	{
+		jRadioButtonSetArea.setSelected(false);
+		m_bDrawdetect = false;
+		jButtonSet.setEnabled(false);
+	}
+	if (jRadioButtonShowArea.isSelected())
+	{
+		hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle,null, 0);
+
+            try
+            {
+                Thread.sleep(200);
+            } catch (InterruptedException ex)
+            {
+                Logger.getLogger(JDialogHideArea.class.getName()).log(Level.SEVERE, null, ex);
+            }
+
+		hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle,ShelterAreaGetCallBack, 0);
+	}
+	else
+	{
+		hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle,null, 0);
+	}
+    }//GEN-LAST:event_jRadioButtonShowAreaActionPerformed
+
+    /*************************************************
+    函数:      "设置遮盖区域"  按钮响应函数
+    函数描述:   根据鼠标移动显示要设置的遮挡区域
+     *************************************************/
+    private void jRadioButtonSetAreaActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jRadioButtonSetAreaActionPerformed
+    {//GEN-HEADEREND:event_jRadioButtonSetAreaActionPerformed
+       	if (m_lPlayHandle.intValue() < 0)
+		return;
+
+        	if (jRadioButtonShowArea.isSelected())
+	{
+		jRadioButtonShowArea.setSelected(false);
+	}
+	if (jRadioButtonSetArea.isSelected())
+	{
+		hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle,null,0);
+		m_bDrawdetect = true;
+		g_iHideAreaCount = 0;
+		for (int i=0; i < HCNetSDK.MAX_SHELTERNUM; i++)
+		{
+			g_rectHideAreaMouse[i].left = 0;
+			g_rectHideAreaMouse[i].top = 0;
+			g_rectHideAreaMouse[i].bottom = 0;
+			g_rectHideAreaMouse[i].right = 0;
+		}
+		jButtonSet.setEnabled(true);
+	}
+	else
+	{
+		m_bDrawdetect = false;
+		hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle,null,0);
+		jButtonSet.setEnabled(false);
+	}
+    }//GEN-LAST:event_jRadioButtonSetAreaActionPerformed
+
+    /*************************************************
+    函数:      "退出"  单击
+    函数描述:   销毁对话框
+     *************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonExitActionPerformed
+    {//GEN-HEADEREND:event_jButtonExitActionPerformed
+       	if (m_lPlayHandle.intValue() >= 0)
+	{
+		hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle, null, 0);
+		hCNetSDK.NET_DVR_StopRealPlay(m_lPlayHandle);
+		m_lPlayHandle.setValue(-1);
+	}
+        dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+
+    /*************************************************
+    函数:      "panelPlay"  单击响应函数
+    函数描述:   保存单击处点的坐标
+     *************************************************/
+    private void panelPlayMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_panelPlayMousePressed
+    {//GEN-HEADEREND:event_panelPlayMousePressed
+       	if (m_bDrawdetect)
+	{
+            Point point = new Point(evt.getX(), evt.getY());
+			hCNetSDK.NET_DVR_RigisterDrawFun(m_lPlayHandle, ShelterAreaSetCallBack, 0);
+			if (g_iHideAreaCount >= HCNetSDK.MAX_SHELTERNUM)
+				g_iHideAreaCount = 0;
+			if (point.x < 0)
+				point.x = 0;
+			g_rectHideAreaMouse[g_iHideAreaCount].left = point.x/16*16;
+			if (point.y < 0)
+				point.y = 0;
+			g_rectHideAreaMouse[g_iHideAreaCount].top = point.y/16*16;
+			g_rectHideAreaMouse[g_iHideAreaCount].right = g_rectHideAreaMouse[g_iHideAreaCount].left;
+			g_rectHideAreaMouse[g_iHideAreaCount].bottom = g_rectHideAreaMouse[g_iHideAreaCount].top;
+			g_rectHideAreaShow[g_iHideAreaCount].left = point.x/16*16;
+			g_rectHideAreaShow[g_iHideAreaCount].top = point.y/16*16;
+			g_rectHideAreaShow[g_iHideAreaCount].right = point.x/16*16 + 1;
+			g_rectHideAreaShow[g_iHideAreaCount].bottom = point.y/16*16 + 1;
+			g_iHideAreaCount ++;
+	}
+    }//GEN-LAST:event_panelPlayMousePressed
+
+    /*************************************************
+    函数:      "panelPlay"  鼠标按下移动  时间响应函数
+    函数描述:   保存移动点坐标并回调画框
+     *************************************************/
+    private void panelPlayMouseDragged(java.awt.event.MouseEvent evt)//GEN-FIRST:event_panelPlayMouseDragged
+    {//GEN-HEADEREND:event_panelPlayMouseDragged
+        if (m_bDrawdetect)
+        {
+            Point point = new Point(evt.getX(), evt.getY());
+            if (point.x > 352)
+            {
+                point.x = 352;
+            }
+            g_rectHideAreaMouse[g_iHideAreaCount - 1].right = point.x / 16 * 16;
+            if (point.y > 288)
+            {
+                point.y = 288;
+            }
+
+            g_rectHideAreaMouse[g_iHideAreaCount - 1].bottom = point.y / 16 * 16;
+            g_rectHideAreaShow[g_iHideAreaCount - 1].right = point.x / 16 * 16;
+            g_rectHideAreaShow[g_iHideAreaCount - 1].bottom = point.y / 16 * 16;
+        }
+    }//GEN-LAST:event_panelPlayMouseDragged
+
+     /*************************************************
+    函数:      initialDialog
+    函数描述:   初始化对话框
+     *************************************************/
+private void initialDialog()
+{
+    	int i;
+	for (i=0; i < HCNetSDK.MAX_SHELTERNUM; i++)
+	{
+                g_rectHideAreaMouse[i] = new RECT();
+                g_rectHideAreaShow[i] = new RECT();
+		g_rectHideAreaMouse[i].left = m_struPicCfg.struShelter[i].wHideAreaTopLeftX/2;
+		g_rectHideAreaMouse[i].top =  m_struPicCfg.struShelter[i].wHideAreaTopLeftY/2;
+		g_rectHideAreaMouse[i].bottom = ( m_struPicCfg.struShelter[i].wHideAreaTopLeftY + m_struPicCfg.struShelter[i].wHideAreaHeight)/2;
+		g_rectHideAreaMouse[i].right = ( m_struPicCfg.struShelter[i].wHideAreaTopLeftX + m_struPicCfg.struShelter[i].wHideAreaWidth)/2;
+	}
+
+       HWND hwnd = new HWND(Native.getComponentPointer(panelPlay));
+        m_strClientInfo = new HCNetSDK.NET_DVR_CLIENTINFO();
+        m_strClientInfo.lChannel = new NativeLong(m_iChanShowNum);
+        m_strClientInfo.hPlayWnd = hwnd;
+        m_lPlayHandle = hCNetSDK.NET_DVR_RealPlay_V30(m_lUserID,
+                m_strClientInfo, null, null, true);
+        if(m_lPlayHandle.intValue() == -1)
+        {
+            JOptionPane.showMessageDialog(this, "预览失败,错误值:" + hCNetSDK.NET_DVR_GetLastError());
+        }
+
+        m_bDrawdetect = false;
+        jRadioButtonShowArea.setEnabled(true);
+        jRadioButtonSetArea.setEnabled(true);
+}
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JButton jButtonSet;
+    private javax.swing.JRadioButton jRadioButtonSetArea;
+    private javax.swing.JRadioButton jRadioButtonShowArea;
+    private java.awt.Panel panelPlay;
+    // End of variables declaration//GEN-END:variables
+
+     /*************************************************
+    类:        FDrawFunSet
+    函数描述:   设置遮挡区域回调函数
+     *************************************************/
+    class FDrawFunSet implements HCNetSDK.FDrawFun
+    {
+        public void invoke(NativeLong lRealHandle, W32API.HDC hDc, int dwUser)
+        {
+          	for (int i=0; i < g_iHideAreaCount; i++)
+	{
+		uSer.DrawEdge(hDc,g_rectHideAreaShow[i],USER32.BDR_SUNKENOUTER,USER32.BF_RECT);
+	}
+            gDi.SetBkMode(hDc,GDI32.TRANSPARENT);
+        }
+    }
+
+     /*************************************************
+    类:        FDrawFunGet
+    函数描述:   显示遮挡区域回调函数
+     *************************************************/
+        class FDrawFunGet implements HCNetSDK.FDrawFun
+    {
+        public void invoke(NativeLong lRealHandle, W32API.HDC hDc, int dwUser)
+        {
+
+        RECT rect = new RECT();
+	int i = 0;
+	//CPoint point;
+        HANDLE hBrush = gDi.CreateSolidBrush(0xffffff);
+
+	for (i=0; i<g_iHideAreaCount; i++)
+	{
+		rect.left = g_rectHideAreaMouse[i].left;
+		rect.top = g_rectHideAreaMouse[i].top;
+		rect.right = g_rectHideAreaMouse[i].right;
+		rect.bottom = g_rectHideAreaMouse[i].bottom;
+		uSer.FillRect(hDc, rect, hBrush);
+	}
+	gDi.SetBkMode(hDc,GDI32.TRANSPARENT);
+        }
+    }
+}

+ 338 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogIPAccessCfg.form

@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="IP&#x63a5;&#x5165;&#x914d;&#x7f6e;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="1" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="1" attributes="0">
+                  <Component id="jScrollPane1" alignment="0" pref="670" max="32767" attributes="0"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="jPanel2" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jScrollPane1" min="-2" pref="507" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="1" attributes="0">
+                  <Component id="jPanel1" min="-2" max="-2" attributes="1"/>
+                  <Component id="jPanel2" min="-2" max="-2" attributes="1"/>
+              </Group>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTable" name="jTableIPAccess">
+          <Properties>
+            <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="this.initialTableModel()" type="code"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jTableIPAccessMousePressed"/>
+          </Events>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x6dfb;&#x52a0;&#x901a;&#x9053;&#x4fe1;&#x606f;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace min="-2" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="1" attributes="0">
+                              <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel1" alignment="1" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldIpAddress" min="-2" pref="104" max="-2" attributes="1"/>
+                              <Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
+                                  <Component id="jTextFieldChannel" alignment="0" max="32767" attributes="1"/>
+                                  <Component id="jTextFieldPort" alignment="0" pref="41" max="32767" attributes="1"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jLabel4" alignment="0" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel5" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="-2" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldUserName" min="-2" pref="68" max="-2" attributes="2"/>
+                              <Component id="jPasswordFieldPawssword" min="-2" max="-2" attributes="1"/>
+                          </Group>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldIpAddress" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldPort" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="1" attributes="0">
+                      <Component id="jLabel3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldChannel" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldUserName" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel5" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jPasswordFieldPawssword" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="IP&#x5730;&#x5740;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x7aef;&#x53e3;&#x53f7;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x901a;&#x9053;&#x53f7;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel4">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x7528;&#x6237;&#x540d;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel5">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5bc6;&#x7801;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldIpAddress">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="172.7.160.2"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldPort">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="8000"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldChannel">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="1"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldUserName">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="admin"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JPasswordField" name="jPasswordFieldPawssword">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="12345"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel2">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="IP&#x63a5;&#x5165;&#x914d;&#x7f6e;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Component id="jButtonAdd" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Component id="jButtonDelete" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <EmptySpace min="-2" pref="44" max="-2" attributes="0"/>
+                          <Component id="jButtonEnable" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace min="-2" pref="30" max="-2" attributes="0"/>
+                  <Component id="jSeparator1" pref="28" max="32767" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Component id="jButtonRefresh" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <EmptySpace min="-2" pref="35" max="-2" attributes="0"/>
+                          <Component id="jButtonSave" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="1" attributes="0">
+                      <Group type="102" alignment="1" attributes="0">
+                          <Group type="103" groupAlignment="1" attributes="0">
+                              <Group type="102" attributes="0">
+                                  <Component id="jButtonEnable" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace min="-2" pref="21" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="1" attributes="0">
+                                  <Component id="jButtonSave" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <Group type="103" groupAlignment="1" attributes="0">
+                              <Group type="103" groupAlignment="3" attributes="0">
+                                  <Component id="jButtonDelete" alignment="3" min="-2" max="-2" attributes="0"/>
+                                  <Component id="jButtonAdd" alignment="3" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="103" groupAlignment="3" attributes="0">
+                                  <Component id="jButtonRefresh" alignment="3" min="-2" max="-2" attributes="0"/>
+                                  <Component id="jButtonExit" alignment="3" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                      </Group>
+                      <Component id="jSeparator1" alignment="1" min="-2" pref="71" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JButton" name="jButtonEnable">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x542f;&#x7528;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonEnableActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonAdd">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6dfb;&#x52a0;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonAddActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonDelete">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5220;&#x9664;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonDeleteActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonSave">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x4fdd;&#x5b58;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSaveActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonRefresh">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5237;&#x65b0;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonRefreshActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JSeparator" name="jSeparator1">
+          <Properties>
+            <Property name="orientation" type="int" value="1"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonExit">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+          </Events>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

+ 798 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogIPAccessCfg.java

@@ -0,0 +1,798 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogIPAccessCfg.java
+ *
+ * Created on 2009-12-3, 9:10:13
+ */
+
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import java.util.Vector;
+
+
+/*****************************************************************************
+ *类 :JDialogIPAccessCfg
+ *类描述 :IP接入配置
+ ****************************************************************************/
+public class JDialogIPAccessCfg extends javax.swing.JDialog {
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    private HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
+    private HCNetSDK.NET_DVR_IPPARACFG  m_strIpparaCfg;//IP参数
+    private NativeLong m_lUserID;//用户ID
+
+    private int m_iCurChanIndex;
+    private int m_iCurSel;
+    private boolean m_bCurEnable;//is the channel added or not
+    private boolean m_bAnalogChange;
+    private boolean m_bGetIpCfg;
+
+    public static final int ANALOG_CHAN_DISABLE = 0;
+    public static final int ANALOG_CHAN_ENABLE = 1;
+    public static final int IP_CHAN_DISABLE = 2;
+    public static final int IP_CHAN_ENABLE = 3;
+
+    /*************************************************
+    函数:      JDialogIPAccessCfg
+    函数描述:   构造函数   Creates new form JDialogIPAccessCfg
+     *************************************************/
+    public JDialogIPAccessCfg(java.awt.Frame parent, boolean modal, NativeLong lUserID, HCNetSDK.NET_DVR_DEVICEINFO_V30 strDeviceInfo) {
+        super(parent, modal);
+        initComponents();
+
+        m_lUserID =lUserID;
+        m_strDeviceInfo = strDeviceInfo;
+
+        initialDialog();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jScrollPane1 = new javax.swing.JScrollPane();
+        jTableIPAccess = new javax.swing.JTable();
+        jPanel1 = new javax.swing.JPanel();
+        jLabel1 = new javax.swing.JLabel();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel4 = new javax.swing.JLabel();
+        jLabel5 = new javax.swing.JLabel();
+        jTextFieldIpAddress = new javax.swing.JTextField();
+        jTextFieldPort = new javax.swing.JTextField();
+        jTextFieldChannel = new javax.swing.JTextField();
+        jTextFieldUserName = new javax.swing.JTextField();
+        jPasswordFieldPawssword = new javax.swing.JPasswordField();
+        jPanel2 = new javax.swing.JPanel();
+        jButtonEnable = new javax.swing.JButton();
+        jButtonAdd = new javax.swing.JButton();
+        jButtonDelete = new javax.swing.JButton();
+        jButtonSave = new javax.swing.JButton();
+        jButtonRefresh = new javax.swing.JButton();
+        jSeparator1 = new javax.swing.JSeparator();
+        jButtonExit = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("IP接入配置");
+
+        jTableIPAccess.setModel(this.initialTableModel());
+        jTableIPAccess.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mousePressed(java.awt.event.MouseEvent evt) {
+                jTableIPAccessMousePressed(evt);
+            }
+        });
+        jScrollPane1.setViewportView(jTableIPAccess);
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("添加通道信息"));
+
+        jLabel1.setText("IP地址");
+
+        jLabel2.setText("端口号");
+
+        jLabel3.setText("通道号");
+
+        jLabel4.setText("用户名");
+
+        jLabel5.setText("密码");
+
+        jTextFieldIpAddress.setText("172.7.160.2");
+
+        jTextFieldPort.setText("8000");
+
+        jTextFieldChannel.setText("1");
+
+        jTextFieldUserName.setText("admin");
+
+        jPasswordFieldPawssword.setText("12345");
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jLabel3)
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                            .addComponent(jLabel2)
+                            .addComponent(jLabel1))
+                        .addGap(18, 18, 18)
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(jTextFieldIpAddress, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+                                .addComponent(jTextFieldChannel, javax.swing.GroupLayout.Alignment.LEADING)
+                                .addComponent(jTextFieldPort, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 41, Short.MAX_VALUE)))
+                        .addGap(18, 18, 18)
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(jLabel4)
+                            .addComponent(jLabel5))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(jTextFieldUserName, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addComponent(jPasswordFieldPawssword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel1)
+                    .addComponent(jTextFieldIpAddress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel2)
+                    .addComponent(jTextFieldPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(jLabel3)
+                    .addComponent(jTextFieldChannel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel4)
+                    .addComponent(jTextFieldUserName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel5)
+                    .addComponent(jPasswordFieldPawssword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+        );
+
+        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("IP接入配置"));
+
+        jButtonEnable.setText("启用");
+        jButtonEnable.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonEnableActionPerformed(evt);
+            }
+        });
+
+        jButtonAdd.setText("添加");
+        jButtonAdd.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonAddActionPerformed(evt);
+            }
+        });
+
+        jButtonDelete.setText("删除");
+        jButtonDelete.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonDeleteActionPerformed(evt);
+            }
+        });
+
+        jButtonSave.setText("保存");
+        jButtonSave.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonSaveActionPerformed(evt);
+            }
+        });
+
+        jButtonRefresh.setText("刷新");
+        jButtonRefresh.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonRefreshActionPerformed(evt);
+            }
+        });
+
+        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
+        jPanel2.setLayout(jPanel2Layout);
+        jPanel2Layout.setHorizontalGroup(
+            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel2Layout.createSequentialGroup()
+                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel2Layout.createSequentialGroup()
+                        .addContainerGap()
+                        .addComponent(jButtonAdd)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jButtonDelete))
+                    .addGroup(jPanel2Layout.createSequentialGroup()
+                        .addGap(44, 44, 44)
+                        .addComponent(jButtonEnable)))
+                .addGap(30, 30, 30)
+                .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE)
+                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel2Layout.createSequentialGroup()
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jButtonRefresh)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jButtonExit))
+                    .addGroup(jPanel2Layout.createSequentialGroup()
+                        .addGap(35, 35, 35)
+                        .addComponent(jButtonSave)))
+                .addContainerGap())
+        );
+        jPanel2Layout.setVerticalGroup(
+            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel2Layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addGroup(jPanel2Layout.createSequentialGroup()
+                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                            .addGroup(jPanel2Layout.createSequentialGroup()
+                                .addComponent(jButtonEnable)
+                                .addGap(21, 21, 21))
+                            .addGroup(jPanel2Layout.createSequentialGroup()
+                                .addComponent(jButtonSave)
+                                .addGap(18, 18, 18)))
+                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                            .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                                .addComponent(jButtonDelete)
+                                .addComponent(jButtonAdd))
+                            .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                                .addComponent(jButtonRefresh)
+                                .addComponent(jButtonExit))))
+                    .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)))
+        );
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 670, Short.MAX_VALUE)
+                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 507, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+     /*************************************************
+    函数:      "启用"  按钮响应函数
+    函数描述:   启用或禁用模拟通道
+     *************************************************/
+    private void jButtonEnableActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonEnableActionPerformed
+    {//GEN-HEADEREND:event_jButtonEnableActionPerformed
+        if (m_bCurEnable)
+        {
+            DefaultTableModel IpTableModel = ((DefaultTableModel) jTableIPAccess.getModel());
+            IpTableModel.setValueAt("否", jTableIPAccess.getSelectedRow(), 5);
+            IpTableModel.setValueAt(ANALOG_CHAN_DISABLE * 1000 + m_iCurChanIndex + "", jTableIPAccess.getSelectedRow(), 6);
+            m_strIpparaCfg.byAnalogChanEnable[m_iCurChanIndex] = 0;
+            SetCtrlStat(0);
+        }
+        else
+        {
+            DefaultTableModel IpTableModel = ((DefaultTableModel) jTableIPAccess.getModel());
+            IpTableModel.setValueAt("是", jTableIPAccess.getSelectedRow(), 5);
+            IpTableModel.setValueAt(ANALOG_CHAN_ENABLE * 1000 + m_iCurChanIndex + "", jTableIPAccess.getSelectedRow(), 6);
+            m_strIpparaCfg.byAnalogChanEnable[m_iCurChanIndex] = 1;
+            SetCtrlStat(1);
+        }
+        m_bAnalogChange = true;
+    }//GEN-LAST:event_jButtonEnableActionPerformed
+
+     /*************************************************
+    函数:      "添加"  按钮响应函数
+    函数描述:   添加或修改IP通道参数
+     *************************************************/
+    private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonAddActionPerformed
+    {//GEN-HEADEREND:event_jButtonAddActionPerformed
+	int i = 0;
+	int j = 0;
+	int dwID = 0;
+	boolean bExistDev = false;
+	int iIPChanIndex = m_iCurChanIndex - HCNetSDK.MAX_ANALOG_CHANNUM;
+	if (iIPChanIndex < 0 && iIPChanIndex >= HCNetSDK.MAX_IP_CHANNEL)
+	{
+               JOptionPane.showMessageDialog(this, String.format("chan [%d] not ip Channel", m_iCurChanIndex));
+		return;
+	}
+	if (m_iCurSel < 0)
+	{
+		JOptionPane.showMessageDialog(this,"请选择列表中的通道");
+		return;
+	}
+	if (Integer.parseInt(jTextFieldChannel.getText()) == 0 || (new String(jTextFieldIpAddress.getText()).equals("0.0.0.0")))
+	{
+		JOptionPane.showMessageDialog(this,"参数错误");
+		return;
+	}
+
+	dwID = m_strIpparaCfg.struIPChanInfo[iIPChanIndex].byIPID;//current connetcted IP device ID
+	//this ip channel is connected to devices
+        if (dwID > 0)
+	{
+		for (j = 0; j < HCNetSDK.MAX_IP_CHANNEL; j++)
+		{
+			if (iIPChanIndex == j)
+			{
+				continue;
+			}
+			if (m_strIpparaCfg.struIPChanInfo[j].byIPID == dwID)
+			{
+				bExistDev = true;
+				break;
+			}
+		}
+
+		if (!bExistDev)
+		{
+                       //this IP device is not connected in other IP channels, clear its device info
+			m_strIpparaCfg.struIPDevInfo[dwID-1] = new HCNetSDK.NET_DVR_IPDEVINFO();
+		}
+	}
+	//clear device info
+	m_strIpparaCfg.struIPChanInfo[iIPChanIndex] = new HCNetSDK.NET_DVR_IPCHANINFO();
+
+	bExistDev = false;
+	dwID = 0;
+
+	for (i = 0; i < hCNetSDK.MAX_IP_DEVICE; i++)
+	{
+		//find existed device
+                String sIP1 = toIPString(new String(m_strIpparaCfg.struIPDevInfo[i].struIP.sIpV4));//结构体里的设备IP
+
+                String sIP2 =  toIPString(new String(jTextFieldIpAddress.getText()));//界面获取的设备IP
+
+		if (sIP2.equals(sIP1) && (Integer.parseInt(jTextFieldPort.getText() ) == m_strIpparaCfg.struIPDevInfo[i].wDVRPort) )
+		{
+			dwID = i+1;
+			System.out.println(String.format("dev[%d]ip[%s]exist", dwID, m_strIpparaCfg.struIPDevInfo[i].struIP.sIpV4));
+			for (j = 0; j< HCNetSDK.MAX_IP_CHANNEL; j++)
+			{
+				if ((m_strIpparaCfg.struIPChanInfo[j].byIPID == dwID) && (Integer.parseInt(jTextFieldChannel.getText()) == m_strIpparaCfg.struIPChanInfo[j].byChannel))
+				{
+					System.out.println(String.format("ipdev[%d]ip[%s]exist, chan[%d] had added", dwID, m_strIpparaCfg.struIPDevInfo[i].struIP.sIpV4, Integer.parseInt(jTextFieldChannel.getText())));
+					JOptionPane.showMessageDialog(this, "对应IP设备的通道已经被添加");
+					return;
+				}
+			}
+			bExistDev = true;
+                        System.out.println(String.format("ipdev[%d]ip[%s]existed and chan[%d] had not been added", dwID, m_strIpparaCfg.struIPDevInfo[i].struIP.sIpV4, Integer.parseInt(jTextFieldChannel.getText())));
+			break;
+		}
+	}
+
+	if (dwID == 0)//new device
+	{
+		for (i = 0; i< HCNetSDK.MAX_IP_DEVICE; i++)
+		{
+			if (m_strIpparaCfg.struIPDevInfo[i].dwEnable != 1)
+			{
+				dwID = i + 1;//find the first empty node
+			        System.out.println(String.format("new ip[%s], ipdev[%d] is disable&can be use",jTextFieldIpAddress.getText(),  dwID));
+				break;
+			}
+		}
+	}
+	if (dwID == 0)
+	{
+		JOptionPane.showMessageDialog(this, "超过最大可添加的ip设备数目");
+		return;
+	}
+	m_strIpparaCfg.struIPChanInfo[iIPChanIndex].byEnable = 0;
+	m_strIpparaCfg.struIPChanInfo[iIPChanIndex].byChannel = (byte) Integer.parseInt(jTextFieldChannel.getText());
+	m_strIpparaCfg.struIPChanInfo[iIPChanIndex].byIPID = (byte)dwID;
+
+	if (!bExistDev)
+	{
+		m_strIpparaCfg.struIPDevInfo[dwID-1].struIP.sIpV4 =  (jTextFieldIpAddress.getText() + "\0").getBytes();
+		m_strIpparaCfg.struIPDevInfo[dwID-1].dwEnable = 1;
+		m_strIpparaCfg.struIPDevInfo[dwID-1].sUserName =  (jTextFieldUserName.getText() + "\0").getBytes();
+		m_strIpparaCfg.struIPDevInfo[dwID-1].sPassword =  (jPasswordFieldPawssword.getPassword() + "\0").getBytes();
+		m_strIpparaCfg.struIPDevInfo[dwID-1].wDVRPort = (short) Integer.parseInt(jTextFieldPort.getText());
+	}
+
+        DefaultTableModel IPTableModel = ((DefaultTableModel) jTableIPAccess.getModel());//获取表格模型
+
+        IPTableModel.setValueAt(toIPString(new String(m_strIpparaCfg.struIPDevInfo[dwID - 1].struIP.sIpV4)), m_iCurSel, 2);
+        IPTableModel.setValueAt(m_strIpparaCfg.struIPDevInfo[dwID - 1].wDVRPort + "", m_iCurSel, 3);
+        IPTableModel.setValueAt(m_strIpparaCfg.struIPChanInfo[iIPChanIndex].byChannel + "", m_iCurSel, 4);
+        IPTableModel.setValueAt("是", m_iCurSel, 5);
+        IPTableModel.setValueAt((IP_CHAN_ENABLE*1000 + m_iCurChanIndex) + "", m_iCurSel, 6);
+        SetCtrlStat(IP_CHAN_ENABLE);
+    }//GEN-LAST:event_jButtonAddActionPerformed
+
+     /*************************************************
+    函数:      "删除"  按钮响应函数
+    函数描述:   删除IP通道
+     *************************************************/
+    private void jButtonDeleteActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonDeleteActionPerformed
+    {//GEN-HEADEREND:event_jButtonDeleteActionPerformed
+       	int i = 0;
+	int dwID = 0;
+	boolean bDeleteDev = true;
+	int iIPChan = m_iCurChanIndex - HCNetSDK.MAX_ANALOG_CHANNUM;//Current ip channel array index
+	if (iIPChan < 0 && iIPChan >= HCNetSDK.MAX_IP_CHANNEL)
+	{
+		System.out.println(String.format("chanindex[%d] err ip Channel", m_iCurChanIndex));
+		return;
+	}
+	dwID = m_strIpparaCfg.struIPChanInfo[iIPChan].byIPID;
+	if (dwID <= 0)
+	{
+            System.out.println("the ip device error!");
+	   return;
+	}
+	for (i = 0; i < HCNetSDK.MAX_IP_CHANNEL; i++)
+	{
+		if (iIPChan != i)
+		{
+			if (dwID == m_strIpparaCfg.struIPChanInfo[i].byIPID)
+			{
+				bDeleteDev = false;//canot delete this IP device as it has been connected in other ip channel
+                                System.out.println("other enable ip channel use the same ip device");
+				break;
+			}
+		}
+	}
+
+	//清空ip设备的信息/clear current ip device
+	if (bDeleteDev)
+	{
+		m_strIpparaCfg.struIPDevInfo[dwID-1] = new HCNetSDK.NET_DVR_IPDEVINFO();
+	}
+	//清空当前ip通道的信息/clear current ip chan
+	m_strIpparaCfg.struIPChanInfo[iIPChan] = new HCNetSDK.NET_DVR_IPCHANINFO();
+
+         DefaultTableModel IPTableModel = ((DefaultTableModel) jTableIPAccess.getModel());//获取表格模型
+        IPTableModel.setValueAt("0.0.0.0", m_iCurSel, 2);
+        IPTableModel.setValueAt( "0", m_iCurSel, 3);
+        IPTableModel.setValueAt("0", m_iCurSel, 4);
+        IPTableModel.setValueAt("否", m_iCurSel, 5);
+        IPTableModel.setValueAt((IP_CHAN_DISABLE*1000 + m_iCurChanIndex) + "", m_iCurSel, 6);
+	SetCtrlStat(IP_CHAN_DISABLE);
+    }//GEN-LAST:event_jButtonDeleteActionPerformed
+
+     /*************************************************
+    函数:      "保存"  按钮响应函数
+    函数描述:   保存参数到设备
+     *************************************************/
+    private void jButtonSaveActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonSaveActionPerformed
+    {//GEN-HEADEREND:event_jButtonSaveActionPerformed
+        if (m_bAnalogChange)
+        {
+            int iResponse = JOptionPane.showConfirmDialog(this, "修改模拟设备配置,需要重启设备,确定重启?", "重启", JOptionPane.OK_CANCEL_OPTION);
+            //确认
+            if (iResponse != 0)
+            {
+                return;
+            }
+        }
+
+        m_strIpparaCfg.write();
+        Pointer lpNetConfig = m_strIpparaCfg.getPointer();
+        boolean setDVRConfigSuc = hCNetSDK.NET_DVR_SetDVRConfig(m_lUserID, HCNetSDK.NET_DVR_SET_IPPARACFG,
+                new NativeLong(0), lpNetConfig, m_strIpparaCfg.size());
+        m_strIpparaCfg.read();
+
+        if (setDVRConfigSuc)
+        {
+            JOptionPane.showMessageDialog(this, "IPC配置设置成功!请刷新!");
+        }
+        else
+        {
+            JOptionPane.showMessageDialog(this, "IPC配置设置失败");
+        }
+    }//GEN-LAST:event_jButtonSaveActionPerformed
+
+    /*************************************************
+    函数:      "刷新"  按钮响应函数
+    函数描述:   重新获取IP参数并显示
+     *************************************************/
+    private void jButtonRefreshActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonRefreshActionPerformed
+    {//GEN-HEADEREND:event_jButtonRefreshActionPerformed
+        initialDialog();
+    }//GEN-LAST:event_jButtonRefreshActionPerformed
+
+      /*************************************************
+    函数:      "退出"  按钮响应函数
+    函数描述:   销毁对话框
+     *************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonExitActionPerformed
+    {//GEN-HEADEREND:event_jButtonExitActionPerformed
+       dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+
+     /*************************************************
+    函数:      "IP通道配置"  表单击相应函数
+    函数描述:   改变相关控制enable属性
+     *************************************************/
+    private void jTableIPAccessMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jTableIPAccessMousePressed
+    {//GEN-HEADEREND:event_jTableIPAccessMousePressed
+        int iPos =  jTableIPAccess.getSelectedRow();
+
+ 	if (iPos < 0)
+ 	{
+ 		return;
+ 	}
+ 	m_iCurSel = iPos;
+        DefaultTableModel IpTableModel = ((DefaultTableModel) jTableIPAccess.getModel());
+	int iData = Integer.parseInt(IpTableModel.getValueAt(m_iCurSel, 6).toString());
+
+	m_iCurChanIndex = iData%1000;
+
+	SetCtrlStat(iData/1000);
+    }//GEN-LAST:event_jTableIPAccessMousePressed
+
+    /*************************************************
+    函数:      initialTableModel
+    函数描述:  初始化IP接入信息列表,写入列名称
+     *************************************************/
+    public DefaultTableModel initialTableModel()
+    {
+        String tabeTile[];
+        tabeTile = new String[]{"序号", "通道号", "IP地址", "端口号", "IP通道号", "是否在线" , "ItemData"};
+        DefaultTableModel alarmTableModel = new DefaultTableModel(tabeTile, 0);
+        return alarmTableModel;
+    }
+
+    /*************************************************
+    函数:      initialDialog
+    函数描述:  初始化Dialog,获取IP配置参数并显示
+     *************************************************/
+    private void initialDialog()
+    {
+        ((DefaultTableModel) jTableIPAccess.getModel()).getDataVector().removeAllElements();//搜索前先清空列表
+
+        //还是要再次获取IP接入配置,防止在外部改变配置后无法刷新到设备里的配置
+        IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
+
+        m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG();
+        m_strIpparaCfg.write();
+        Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
+        m_bGetIpCfg = hCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
+        m_strIpparaCfg.read();
+
+        int i = 0;
+        int dwChanNum = 0;
+        int iIndex = 0;
+        int dwIPChanIndex = 0;
+        int dwID = 0;
+        m_iCurChanIndex = -1;
+        m_iCurSel = -1;
+
+        EnableInfoCtrl(false);
+	SetCtrlStat(2);
+        DefaultTableModel IPTableModel = ((DefaultTableModel) jTableIPAccess.getModel());//获取表格模型
+
+        if (m_bGetIpCfg)
+        {
+            for (i = 0; i < hCNetSDK.MAX_CHANNUM_V30; i++)
+            {
+                Vector<String> newRow = new Vector<String>();
+                dwChanNum = i + m_strDeviceInfo.byStartChan;
+
+                if (i < m_strDeviceInfo.byChanNum)
+                {
+                    newRow.add(String.format("%02d", iIndex + 1));
+                    newRow.add("Camera" + dwChanNum);
+                    newRow.add("本地");
+                    newRow.add("0");
+                    newRow.add("0");
+
+                    if (m_strIpparaCfg.byAnalogChanEnable[i] == 1)
+                    {
+                        newRow.add("是");
+                        newRow.add((ANALOG_CHAN_ENABLE*1000 + i) + "");
+                    }
+                    else
+                    {
+                        newRow.add("否");
+                        newRow.add((ANALOG_CHAN_DISABLE*1000 + i) + "");
+                    }
+                    iIndex++;
+                    IPTableModel.getDataVector().add(newRow);
+                    ((DefaultTableModel) jTableIPAccess.getModel()).fireTableStructureChanged();
+                }
+                else
+                {
+                    if (i >= HCNetSDK.MAX_ANALOG_CHANNUM && i < (m_strDeviceInfo.byIPChanNum + HCNetSDK.MAX_ANALOG_CHANNUM))
+                    {
+                        dwIPChanIndex = i - HCNetSDK.MAX_ANALOG_CHANNUM;
+                        dwChanNum = dwIPChanIndex + m_strDeviceInfo.byStartChan;
+                        dwID = m_strIpparaCfg.struIPChanInfo[dwIPChanIndex].byIPID;
+
+                        newRow.add(String.format("%02d", iIndex + 1));
+                        newRow.add("IPCamera" + dwChanNum);
+
+                        if (m_strIpparaCfg.struIPChanInfo[dwIPChanIndex].byIPID != 0)
+                        {
+                            newRow.add(toIPString(new String(m_strIpparaCfg.struIPDevInfo[dwID - 1].struIP.sIpV4)));
+                            newRow.add(m_strIpparaCfg.struIPDevInfo[dwID - 1].wDVRPort + "");
+                            newRow.add(m_strIpparaCfg.struIPChanInfo[dwIPChanIndex].byChannel + "");
+                            if (m_strIpparaCfg.struIPChanInfo[dwIPChanIndex].byEnable == 1)
+                            {
+                                newRow.add("在线");
+                            }
+                            else
+                            {
+                                newRow.add("离线");
+                            }
+                        newRow.add((IP_CHAN_ENABLE*1000 + i) + "");
+                        }
+                         else
+                        {
+                            newRow.add("0.0.0.0");
+                            newRow.add("0");
+                            newRow.add("0");
+                            newRow.add("否");
+                            newRow.add((IP_CHAN_DISABLE*1000 + i) + "");
+                        }
+                        iIndex++;
+                        IPTableModel.getDataVector().add(newRow);
+                    ((DefaultTableModel) jTableIPAccess.getModel()).fireTableStructureChanged();
+                    }
+                }
+            }
+
+		jButtonSave.setEnabled(true);
+		this.setEnabled(true);
+        }
+        else
+        {
+		jButtonSave.setEnabled(false);
+                JOptionPane.showMessageDialog(this, "不支持IP设备");
+        }
+    }
+
+    /*************************************************
+    函数:      EnableInfoCtrl
+    函数描述:  修改enable属性
+     *************************************************/
+   private void EnableInfoCtrl(boolean bEnable)
+{
+	jTextFieldIpAddress.setEditable(bEnable);
+	jTextFieldUserName.setEditable(bEnable);
+	jTextFieldPort.setEditable(bEnable);
+	jPasswordFieldPawssword.setEditable(bEnable);
+	jTextFieldChannel.setEditable(bEnable);
+}
+
+    /*************************************************
+    函数:      SetCtrlStat
+    函数描述:  更爱按钮名称及enable属性
+     *************************************************/
+    private void SetCtrlStat(int iStat)
+    {
+        int dwID = 0;
+        switch (iStat)
+        {
+            case ANALOG_CHAN_DISABLE://analog disable
+                jButtonEnable.setEnabled(true);
+                jButtonAdd.setEnabled(false);
+                jButtonDelete.setEnabled(false);
+                jButtonEnable.setText("启用");
+                EnableInfoCtrl(false);
+                m_bCurEnable = false;
+                break;
+            case ANALOG_CHAN_ENABLE://analog enable channel
+                jButtonEnable.setEnabled(true);
+                jButtonAdd.setEnabled(false);
+                jButtonDelete.setEnabled(false);
+                jButtonEnable.setText("禁用");
+                EnableInfoCtrl(false);
+                m_bCurEnable = true;
+                break;
+            case IP_CHAN_DISABLE://digital disable channel
+                jButtonAdd.setEnabled(true);
+                jButtonAdd.setText("添加");
+                jButtonEnable.setEnabled(false);
+                jButtonDelete.setEnabled(false);
+                EnableInfoCtrl(true);
+                m_bCurEnable = false;
+                break;
+            case IP_CHAN_ENABLE://digital enable
+                jButtonAdd.setEnabled(true);
+                jButtonAdd.setText("修改");
+                jButtonEnable.setEnabled(false);
+                jButtonDelete.setEnabled(true);
+                if ((m_iCurChanIndex - HCNetSDK.MAX_ANALOG_CHANNUM) != 0)
+                {
+                    dwID = m_strIpparaCfg.struIPChanInfo[m_iCurChanIndex - HCNetSDK.MAX_ANALOG_CHANNUM].byIPID;
+                    if (dwID > 0)
+                    {
+                        jTextFieldIpAddress.setText(new String(m_strIpparaCfg.struIPDevInfo[dwID - 1].struIP.sIpV4));
+                    }
+                }
+                EnableInfoCtrl(true);
+                m_bCurEnable = true;
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonAdd;
+    private javax.swing.JButton jButtonDelete;
+    private javax.swing.JButton jButtonEnable;
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JButton jButtonRefresh;
+    private javax.swing.JButton jButtonSave;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JPanel jPanel2;
+    private javax.swing.JPasswordField jPasswordFieldPawssword;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JSeparator jSeparator1;
+    private javax.swing.JTable jTableIPAccess;
+    private javax.swing.JTextField jTextFieldChannel;
+    private javax.swing.JTextField jTextFieldIpAddress;
+    private javax.swing.JTextField jTextFieldPort;
+    private javax.swing.JTextField jTextFieldUserName;
+    // End of variables declaration//GEN-END:variables
+
+    /*************************************************
+    函数:      toIPString
+    函数描述:  主要是与C中的字符串格式一致,比较字符串时,去"\0"之前的一段字符串
+     *************************************************/
+     String toIPString(String s)
+    {
+         String[] sIP = new String[2];//结构体里的设备IP
+         sIP = s.split("\0", 2);
+         return sIP[0];
+    }
+
+}

+ 972 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogMotionDetect.form

@@ -0,0 +1,972 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x79fb;&#x52a8;&#x4fa6;&#x6d4b;&#x8bbe;&#x7f6e;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="panelPlay" min="-2" pref="352" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="jPanel1" alignment="0" min="-2" max="-2" attributes="1"/>
+                  <Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
+                      <Component id="jPanel3" alignment="0" max="32767" attributes="1"/>
+                      <Component id="jPanel2" alignment="0" pref="263" max="32767" attributes="1"/>
+                  </Group>
+              </Group>
+          </Group>
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
+              <Component id="jPanel4" max="32767" attributes="0"/>
+          </Group>
+          <Group type="102" alignment="1" attributes="0">
+              <EmptySpace pref="449" max="32767" attributes="0"/>
+              <Component id="jButtonSave" min="-2" max="-2" attributes="0"/>
+              <EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
+              <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+              <EmptySpace min="-2" pref="49" max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jPanel1" min="-2" pref="89" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jPanel2" min="-2" pref="90" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="1" max="-2" attributes="0"/>
+                      <Component id="jPanel3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="1" attributes="1">
+                      <EmptySpace max="32767" attributes="0"/>
+                      <Component id="panelPlay" min="-2" pref="288" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="19" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel4" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jButtonSave" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jButtonExit" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="14" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="java.awt.Panel" name="panelPlay">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="cc" type="rgb"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="panelPlayMousePressed"/>
+        <EventHandler event="mouseDragged" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="panelPlayMouseDragged"/>
+      </Events>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x533a;&#x57df;&#x8bbe;&#x7f6e;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="32767" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxGetMotionArea" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Group type="102" alignment="0" attributes="0">
+                          <EmptySpace min="21" pref="21" max="21" attributes="0"/>
+                          <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxSetMotionArea" min="-2" max="-2" attributes="0"/>
+                      <Component id="jComboBoxSensitive" alignment="0" min="-2" pref="62" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jCheckBoxGetMotionArea" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxSetMotionArea" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="8" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jComboBoxSensitive" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxGetMotionArea">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x663e;&#x793a;&#x79fb;&#x52a8;&#x4fa6;&#x6d4b;&#x533a;&#x57df;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jCheckBoxGetMotionAreaActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxSetMotionArea">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x8bbe;&#x7f6e;&#x79fb;&#x52a8;&#x4fa6;&#x6d4b;&#x533a;&#x57df;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jCheckBoxSetMotionAreaActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x7075;&#x654f;&#x5ea6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxSensitive">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="7">
+                <StringItem index="0" value="&#x5173;&#x95ed;"/>
+                <StringItem index="1" value="0--&#x6700;&#x4f4e;"/>
+                <StringItem index="2" value="1"/>
+                <StringItem index="3" value="2"/>
+                <StringItem index="4" value="3"/>
+                <StringItem index="5" value="4"/>
+                <StringItem index="6" value="5--&#x6700;&#x9ad8;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel2">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x89e6;&#x53d1;&#x5f55;&#x50cf;&#x901a;&#x9053;"/>
+          </Border>
+        </Property>
+        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[304, 97]"/>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Component id="jScrollPane1" min="-2" pref="227" max="-2" attributes="0"/>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Component id="jScrollPane1" alignment="0" pref="61" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JList" name="jListTraggerRecord">
+              <Properties>
+                <Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel3">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x62a5;&#x8b66;&#x5904;&#x7406;&#x65b9;&#x5f0f;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxMonitorAlarm" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxCenter" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxJPEG" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxAudioAlarm" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="28" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jCheckBoxAlarmout" min="-2" max="-2" attributes="0"/>
+                      <Component id="jScrollPane2" min="-2" pref="116" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace pref="12" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jCheckBoxMonitorAlarm" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jCheckBoxAlarmout" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <Component id="jCheckBoxAudioAlarm" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="2" max="-2" attributes="0"/>
+                          <Component id="jCheckBoxCenter" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jCheckBoxJPEG" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Component id="jScrollPane2" min="0" pref="0" max="32767" attributes="1"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxMonitorAlarm">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x76d1;&#x89c6;&#x5668;&#x8b66;&#x544a;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxCenter">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x4e0a;&#x4f20;&#x4e2d;&#x5fc3;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxAudioAlarm">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x58f0;&#x97f3;&#x8b66;&#x544a;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxJPEG">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Email JPEG"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JCheckBox" name="jCheckBoxAlarmout">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x89e6;&#x53d1;&#x62a5;&#x8b66;&#x8f93;&#x51fa;"/>
+          </Properties>
+        </Component>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane2">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JList" name="jListTraggerAlarmOut">
+              <Properties>
+                <Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel4">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x5e03;&#x9632;&#x65f6;&#x95f4;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                      <Group type="102" attributes="0">
+                          <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                              <Component id="jLabel9" alignment="0" pref="54" max="32767" attributes="1"/>
+                              <Component id="jLabel8" alignment="0" max="32767" attributes="1"/>
+                              <Component id="jLabel10" alignment="0" max="32767" attributes="1"/>
+                              <Component id="jLabel16" alignment="0" min="-2" max="-2" attributes="1"/>
+                          </Group>
+                          <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour1" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel18" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin1" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour2" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel36" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin2" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour3" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel40" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin3" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour4" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel44" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin4" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jLabel17" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Component id="jLabel35" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Component id="jLabel39" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Component id="jLabel43" alignment="0" min="-2" pref="30" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="1">
+                          <Component id="jLabel7" min="-2" pref="50" max="-2" attributes="0"/>
+                          <EmptySpace max="32767" attributes="0"/>
+                          <Component id="jComboBoxDate" min="-2" pref="90" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour1" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel15" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin1" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel19" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour2" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel34" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin2" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel33" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour3" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel38" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin3" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel37" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndHour4" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel42" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndMin4" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel41" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace min="-2" pref="60" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                      <Component id="jLabel11" alignment="0" pref="52" max="32767" attributes="1"/>
+                      <Component id="jLabel12" alignment="0" max="32767" attributes="1"/>
+                      <Component id="jLabel13" alignment="0" max="32767" attributes="1"/>
+                      <Component id="jLabel14" alignment="0" min="-2" max="-2" attributes="1"/>
+                  </Group>
+                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour5" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel48" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin5" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel47" min="-2" pref="30" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour6" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel52" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin6" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel51" min="-2" pref="30" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInEndHour5" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel46" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInEndHour6" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel50" min="-2" pref="20" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInBeginHour7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel53" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInBeginMin7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel54" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Component id="jTextFieldInEndHour7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jLabel56" min="-2" pref="20" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="1" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jTextFieldInBeginHour8" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel59" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInBeginMin8" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel60" min="-2" pref="30" max="-2" attributes="0"/>
+                                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                                  <Component id="jTextFieldInEndHour8" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <Component id="jLabel58" min="-2" pref="20" max="-2" attributes="0"/>
+                                  <EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndMin5" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInEndMin6" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInEndMin7" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInEndMin8" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                              <Component id="jButtonConfirm" alignment="1" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jLabel45" alignment="0" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jLabel57" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jLabel55" min="-2" pref="20" max="-2" attributes="0"/>
+                              <Component id="jLabel49" min="-2" pref="20" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                  </Group>
+                  <EmptySpace pref="19" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel7" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jComboBoxDate" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour1" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel15" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin1" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel19" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour2" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel34" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin2" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel33" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel38" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel37" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInEndHour4" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel42" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInEndMin4" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel41" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabel17" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel35" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel39" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel43" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour1" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel18" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin1" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour2" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel36" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin2" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel40" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jTextFieldInBeginHour4" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel44" min="-2" max="-2" attributes="0"/>
+                              <Component id="jTextFieldInBeginMin4" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabel16" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel10" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel9" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                          <Component id="jLabel8" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jLabel11" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                                  <Component id="jLabel12" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour5" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel46" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                                  <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour6" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel50" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInBeginHour5" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel48" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin5" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel47" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                                  <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInBeginHour6" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel52" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin6" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel51" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                          </Group>
+                          <EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="jLabel13" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+                                  <Component id="jLabel14" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour7" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel56" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginHour7" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel53" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin7" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel54" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                                  <EmptySpace max="-2" attributes="0"/>
+                                  <Group type="103" groupAlignment="0" attributes="0">
+                                      <Component id="jTextFieldInEndHour8" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel58" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginHour8" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel59" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jTextFieldInBeginMin8" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      <Component id="jLabel60" alignment="0" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                          </Group>
+                      </Group>
+                      <Component id="jLabel45" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jTextFieldInEndMin5" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="9" pref="9" max="9" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="jTextFieldInEndMin6" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel49" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="jTextFieldInEndMin7" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel55" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="jTextFieldInEndMin8" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel57" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                  </Group>
+                  <EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
+                  <Component id="jButtonConfirm" min="-2" max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel8">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;4"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel9">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;3"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel10">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;2"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel11">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;5"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel12">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;6"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel13">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;7"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel14">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;8"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel16">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;&#x6bb5;1"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin1">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour1">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin1">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour1">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel15">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel17">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel18">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel19">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel33">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel34">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel35">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel36">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour2">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel37">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel38">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel39">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel40">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour3">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel41">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel42">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel43">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel44">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour4">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel45">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel46">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel47">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel48">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour5">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel49">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin6">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel50">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour6">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel51">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin6">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel52">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour6">
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonConfirm">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x786e;&#x5b9a;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonConfirmActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel53">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour7">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel54">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin7">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin7">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel55">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour7">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel56">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndHour8">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel57">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel58">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInEndMin8">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel59">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginHour8">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel60">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206; --"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldInBeginMin8">
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxDate">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="7">
+                <StringItem index="0" value="&#x661f;&#x671f;&#x4e00;"/>
+                <StringItem index="1" value="&#x661f;&#x671f;&#x4e8c;"/>
+                <StringItem index="2" value="&#x661f;&#x671f;&#x4e09;"/>
+                <StringItem index="3" value="&#x661f;&#x671f;&#x56db;"/>
+                <StringItem index="4" value="&#x661f;&#x671f;&#x4e94;"/>
+                <StringItem index="5" value="&#x661f;&#x671f;&#x516d;"/>
+                <StringItem index="6" value="&#x661f;&#x671f;&#x65e5;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jComboBoxDateActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel7">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65e5;&#x671f;"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonSave">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x786e;&#x5b9a;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSaveActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

File diff suppressed because it is too large
+ 1394 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogMotionDetect.java


+ 222 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogPTZCruise.form

@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x5de1;&#x822a;&#x8def;&#x5f84;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-23,0,0,1,85"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+    <Property name="useNullLayout" type="boolean" value="true"/>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="10" width="320" height="190"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5de1;&#x822a;&#x8def;&#x5f84;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="20" y="20" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxCruiseRoute">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="0"/>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="100" y="20" width="110" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Container class="javax.swing.JPanel" name="jPanel2">
+          <Properties>
+            <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+              <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+                <TitledBorder>
+                  <Border PropertyName="innerBorder" info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+                    <TitledBorder title="&#x5de1;&#x822a;&#x70b9;"/>
+                  </Border>
+                </TitledBorder>
+              </Border>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="50" width="300" height="90"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+            <Property name="useNullLayout" type="boolean" value="true"/>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JLabel" name="jLabel2">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5de1;&#x822a;&#x70b9;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="10" y="20" width="40" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel3">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x9884;&#x7f6e;&#x70b9;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="140" y="20" width="50" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel4">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x65f6;&#x95f4;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="10" y="60" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel5">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x901f;&#x5ea6;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="140" y="60" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="jComboBoxCruisePoint">
+              <Properties>
+                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="60" y="20" width="60" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="jComboBoxTime">
+              <Properties>
+                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="60" y="60" width="60" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="jComboBoxSpeed">
+              <Properties>
+                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="190" y="60" width="70" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="jComboBoxPresetPoint">
+              <Properties>
+                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+                  <StringArray count="0"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="190" y="20" width="70" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Component class="javax.swing.JButton" name="jButtonAdd">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6dfb;&#x52a0;&#x5de1;&#x822a;&#x70b9;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonAddActionPerformed"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="30" y="150" width="100" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonDelete">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5220;&#x9664;&#x5de1;&#x822a;&#x70b9;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonDeleteActionPerformed"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="170" y="150" width="100" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="250" y="210" width="70" height="-1"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+  </SubComponents>
+</Form>

+ 264 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogPTZCruise.java

@@ -0,0 +1,264 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogCruise.java
+ *
+ * Created on 2009-11-2, 19:36:07
+ */
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.NativeLong;
+
+import javax.swing.*;
+
+/*****************************************************************************
+ *类 :JDialogPTZCruise
+ *类描述 :设置巡航路径
+ ****************************************************************************/
+public class JDialogPTZCruise extends javax.swing.JDialog
+{
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    public static final int MAX_CRUISE_SEQ = 32;
+    public static final int MAX_CRUISE_POINT = 32;
+    public static final int MAX_CRUISE_PRESET = 128;
+    public static final int MAX_CRUISE_TIME = 255;
+    public static final int MAX_CRUISE_SPEED = 15;
+    private int m_iCruiseNum;
+    private int m_iSeqPoint;
+    private int m_iPresetNum;
+    private int m_iSeqDwell;//time interval
+    private int m_iSeqSpeed;
+    private int m_iChanNum;//通道号,不是通道索引
+    private NativeLong m_lRealHandle;//预览句柄
+
+    /*************************************************
+    函数:      JDialogPTZCruise
+    函数描述:	构造函数   Creates new form JDialogPTZCruise
+     *************************************************/
+    public JDialogPTZCruise(java.awt.Frame parent, boolean modal, NativeLong lRealHandle)
+    {
+        super(parent, modal);
+        initComponents();
+        initDialog();
+        m_lRealHandle = lRealHandle;
+    }
+
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel1 = new javax.swing.JPanel();
+        jLabel1 = new javax.swing.JLabel();
+        jComboBoxCruiseRoute = new javax.swing.JComboBox();
+        jPanel2 = new javax.swing.JPanel();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel4 = new javax.swing.JLabel();
+        jLabel5 = new javax.swing.JLabel();
+        jComboBoxCruisePoint = new javax.swing.JComboBox();
+        jComboBoxTime = new javax.swing.JComboBox();
+        jComboBoxSpeed = new javax.swing.JComboBox();
+        jComboBoxPresetPoint = new javax.swing.JComboBox();
+        jButtonAdd = new javax.swing.JButton();
+        jButtonDelete = new javax.swing.JButton();
+        jButtonExit = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("巡航路径");
+        getContentPane().setLayout(null);
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
+        jPanel1.setLayout(null);
+
+        jLabel1.setText("巡航路径");
+        jPanel1.add(jLabel1);
+        jLabel1.setBounds(20, 20, 60, 15);
+
+        jPanel1.add(jComboBoxCruiseRoute);
+        jComboBoxCruiseRoute.setBounds(100, 20, 110, 21);
+
+        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createTitledBorder("巡航点")));
+        jPanel2.setLayout(null);
+
+        jLabel2.setText("巡航点");
+        jPanel2.add(jLabel2);
+        jLabel2.setBounds(10, 20, 40, 15);
+
+        jLabel3.setText("预置点");
+        jPanel2.add(jLabel3);
+        jLabel3.setBounds(140, 20, 50, 15);
+
+        jLabel4.setText("时间");
+        jPanel2.add(jLabel4);
+        jLabel4.setBounds(10, 60, 30, 15);
+
+        jLabel5.setText("速度");
+        jPanel2.add(jLabel5);
+        jLabel5.setBounds(140, 60, 30, 15);
+
+        jPanel2.add(jComboBoxCruisePoint);
+        jComboBoxCruisePoint.setBounds(60, 20, 60, 21);
+
+        jPanel2.add(jComboBoxTime);
+        jComboBoxTime.setBounds(60, 60, 60, 21);
+
+        jPanel2.add(jComboBoxSpeed);
+        jComboBoxSpeed.setBounds(190, 60, 70, 21);
+
+        jPanel2.add(jComboBoxPresetPoint);
+        jComboBoxPresetPoint.setBounds(190, 20, 70, 21);
+
+        jPanel1.add(jPanel2);
+        jPanel2.setBounds(10, 50, 300, 90);
+
+        jButtonAdd.setText("添加巡航点");
+        jButtonAdd.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonAddActionPerformed(evt);
+            }
+        });
+        jPanel1.add(jButtonAdd);
+        jButtonAdd.setBounds(30, 150, 100, 23);
+
+        jButtonDelete.setText("删除巡航点");
+        jButtonDelete.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonDeleteActionPerformed(evt);
+            }
+        });
+        jPanel1.add(jButtonDelete);
+        jButtonDelete.setBounds(170, 150, 100, 23);
+
+        getContentPane().add(jPanel1);
+        jPanel1.setBounds(10, 10, 320, 190);
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jButtonExit);
+        jButtonExit.setBounds(250, 210, 70, 23);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      "添加巡航点" 按钮单击响应函数
+    函数描述:	添加巡航点
+     *************************************************/
+    private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddActionPerformed
+        boolean bRet = false;
+        m_iCruiseNum = jComboBoxCruiseRoute.getSelectedIndex() + 1;
+        m_iSeqPoint = jComboBoxCruisePoint.getSelectedIndex() + 1;
+        m_iPresetNum = jComboBoxPresetPoint.getSelectedIndex() + 1;
+        m_iSeqDwell = jComboBoxTime.getSelectedIndex() + 1;
+        m_iSeqSpeed = jComboBoxSpeed.getSelectedIndex() + 1;
+
+        bRet = Set_NET_DVR_PTZCruise(m_iChanNum, HCNetSDK.FILL_PRE_SEQ, (byte) m_iCruiseNum, (byte) m_iSeqPoint, (short) m_iPresetNum);
+        if (bRet)
+        {
+            bRet = Set_NET_DVR_PTZCruise(m_iChanNum, HCNetSDK.SET_SEQ_DWELL, (byte) m_iCruiseNum, (byte) m_iSeqPoint, (short) m_iSeqDwell);
+            if (bRet)
+            {
+                bRet = Set_NET_DVR_PTZCruise(m_iChanNum, HCNetSDK.SET_SEQ_SPEED, (byte) m_iCruiseNum, (byte) m_iSeqPoint, (short) m_iSeqSpeed);
+            }
+        }
+    }//GEN-LAST:event_jButtonAddActionPerformed
+
+    /*************************************************
+    函数:      "删除巡航点" 按钮单击响应函数
+    函数描述:	删除巡航点
+     *************************************************/
+    private void jButtonDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDeleteActionPerformed
+        m_iCruiseNum = jComboBoxCruiseRoute.getSelectedIndex() + 1;
+        m_iSeqPoint = jComboBoxCruisePoint.getSelectedIndex() + 1;
+        m_iPresetNum = jComboBoxPresetPoint.getSelectedIndex() + 1;
+        if (!hCNetSDK.NET_DVR_PTZCruise(m_lRealHandle, HCNetSDK.CLE_PRE_SEQ, (byte) m_iCruiseNum, (byte) m_iSeqPoint, (short) m_iPresetNum))
+        {
+            JOptionPane.showInternalMessageDialog(this, "删除失败");
+            return;
+        }
+    }//GEN-LAST:event_jButtonDeleteActionPerformed
+
+    /*************************************************
+    函数:      "退出" 按钮单击响应函数
+    函数描述:	添加销毁窗口巡航点
+     *************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
+        this.dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+
+    /*************************************************
+    函数:      initDialog
+    函数描述:	初始化窗口
+     *************************************************/
+    private void initDialog()
+    {
+
+        int i;
+        for (i = 0; i < MAX_CRUISE_SEQ; i++)
+        {
+            jComboBoxCruiseRoute.addItem("巡航路径" + (i + 1));
+        }
+
+        for (i = 0; i < MAX_CRUISE_POINT; i++)
+        {
+            jComboBoxCruisePoint.addItem(i + 1);
+        }
+
+        for (i = 0; i < MAX_CRUISE_PRESET; i++)
+        {
+            jComboBoxPresetPoint.addItem(i + 1);
+        }
+
+        for (i = 0; i < MAX_CRUISE_TIME; i++)
+        {
+            jComboBoxTime.addItem(i + 1);
+        }
+        jComboBoxTime.setSelectedIndex(3);
+
+        for (i = 0; i < MAX_CRUISE_SPEED; i++)
+        {
+            jComboBoxSpeed.addItem(i + 1);
+        }
+        jComboBoxSpeed.setSelectedIndex(9);
+    }
+
+    private boolean Set_NET_DVR_PTZCruise(int iChanNum, int dwPTZCruiseCmd, byte byCruiseRoute, byte byCruisePoint, short wInput)
+    {
+        if (!hCNetSDK.NET_DVR_PTZCruise(m_lRealHandle, dwPTZCruiseCmd, byCruiseRoute, byCruisePoint, wInput))
+        {
+            JOptionPane.showInternalMessageDialog(this, "设置失败");
+            return false;
+        }
+        return true;
+    }
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonAdd;
+    private javax.swing.JButton jButtonDelete;
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JComboBox jComboBoxCruisePoint;
+    private javax.swing.JComboBox jComboBoxCruiseRoute;
+    private javax.swing.JComboBox jComboBoxPresetPoint;
+    private javax.swing.JComboBox jComboBoxSpeed;
+    private javax.swing.JComboBox jComboBoxTime;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JPanel jPanel2;
+    // End of variables declaration//GEN-END:variables
+}

+ 773 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBack.form

@@ -0,0 +1,773 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.6" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <NonVisualComponents>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup1">
+    </Component>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x6309;&#x6587;&#x4ef6;&#x56de;&#x653e;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,101,0,0,2,-48"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+    <Property name="useNullLayout" type="boolean" value="true"/>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="390" width="530" height="180"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTable" name="jTableFile">
+          <Properties>
+            <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="this.initialTableModel()" type="code"/>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x67e5;&#x627e;&#x4fe1;&#x606f;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="10" y="10" width="290" height="380"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabelType">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5f55;&#x50cf;&#x7c7b;&#x578b;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="30" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabelFileType">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6587;&#x4ef6;&#x5c5e;&#x6027;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="60" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxRecodType">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="8">
+                <StringItem index="0" value="&#x5168;&#x90e8;"/>
+                <StringItem index="1" value="&#x5b9a;&#x65f6;&#x5f55;&#x50cf;"/>
+                <StringItem index="2" value="&#x79fb;&#x52a8;&#x4fa6;&#x6d4b;"/>
+                <StringItem index="3" value="&#x62a5;&#x8b66;&#x89e6;&#x53d1;"/>
+                <StringItem index="4" value="&#x62a5;&#x8b66;|&#x52a8;&#x6d4b;"/>
+                <StringItem index="5" value="&#x62a5;&#x8b66;&amp;&#x52a8;&#x6d4b;"/>
+                <StringItem index="6" value="&#x547d;&#x4ee4;&#x89e6;&#x53d1;"/>
+                <StringItem index="7" value="&#x624b;&#x52a8;&#x5f55;&#x50cf;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="90" y="30" width="110" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="jComboBoxFlieType">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="3">
+                <StringItem index="0" value="&#x5168;&#x90e8;"/>
+                <StringItem index="1" value="&#x89e3;&#x9501;"/>
+                <StringItem index="2" value="&#x9501;&#x5b9a;"/>
+              </StringArray>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="90" y="60" width="110" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JRadioButton" name="jRadioButtonByCardNumber">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="90" y="120" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldCardNumber">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="0"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="90" y="150" width="190" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel14">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x901a;&#x9053;&#x53f7;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="90" width="-1" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldChannelNumber">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="1"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="90" y="90" width="110" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonSearch">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x67e5;&#x627e;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSearchActionPerformed"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="340" width="60" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Container class="javax.swing.JPanel" name="jPanelTime">
+          <Properties>
+            <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+              <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+                <LineBorder>
+                  <Color PropertyName="color" blue="cc" green="cc" red="cc" type="rgb"/>
+                </LineBorder>
+              </Border>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="190" width="270" height="130"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+            <Property name="useNullLayout" type="boolean" value="true"/>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JLabel" name="jLabelStartTime">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5f00;&#x59cb;&#x65f6;&#x95f4;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="10" y="10" width="50" height="50"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabelEndTime">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x7ed3;&#x675f;&#x65f6;&#x95f4;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="10" y="70" width="60" height="50"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldsYear">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="80" y="10" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldsMonth">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="150" y="10" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldsDay">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="210" y="10" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldsHour">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="80" y="40" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldsMinute">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="150" y="40" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldsSecond">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="210" y="40" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel1">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5e74;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="120" y="10" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel2">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6708;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="190" y="10" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel3">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x65e5;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="250" y="10" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel4">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="120" y="40" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel5">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5206;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="190" y="40" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel6">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x79d2;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="250" y="40" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldeMonth">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="150" y="70" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldeDay">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="210" y="70" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldeHour">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="80" y="100" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldeMinute">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="150" y="100" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldeSecond">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="210" y="100" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel7">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5e74;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="120" y="70" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel8">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x6708;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="190" y="70" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel9">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x65e5;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="250" y="70" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel10">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="120" y="100" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel11">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x5206;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="190" y="100" width="20" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel12">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="&#x79d2;"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="250" y="100" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JTextField" name="jTextFieldeYear">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+                  <AbsoluteConstraints x="80" y="70" width="30" height="-1"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Component class="javax.swing.JLabel" name="jLabel13">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5361;&#x53f7;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="150" width="40" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel20">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x662f;&#x5426;&#x6309;&#x5361;&#x53f7;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="120" width="80" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanelPlayControl">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x56de;&#x653e;&#x63a7;&#x5236;"/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="300" y="10" width="410" height="380"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Container class="java.awt.Panel" name="panelPlayBack">
+          <Properties>
+            <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+              <Color blue="ff" green="ff" red="f0" type="rgb"/>
+            </Property>
+            <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+              <Color blue="ff" green="ff" red="99" type="rgb"/>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="20" width="390" height="300"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+        </Container>
+        <Component class="javax.swing.JSlider" name="jSliderPlayback">
+          <Properties>
+            <Property name="value" type="int" value="0"/>
+          </Properties>
+          <Events>
+            <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jSliderPlaybackMouseReleased"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="0" y="330" width="400" height="20"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Container class="javax.swing.JToolBar" name="jToolBar2">
+          <Properties>
+            <Property name="rollover" type="boolean" value="true"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="350" width="380" height="-1"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JButton" name="jButtonPlay">
+              <Properties>
+                <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="cc" red="cc" type="rgb"/>
+                </Property>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Play"/>
+                <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+                  <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+                    <EmptyBorder/>
+                  </Border>
+                </Property>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonPlayActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonStop">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Stop"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonStopActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel17">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="      "/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonNormal">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Normal"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonNormalActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonPause">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Pause"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonPauseActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel18">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="      "/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonSlow">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Slow"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSlowActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonFast">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Fast"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonFastActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel19">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="      "/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonCapture">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Capture"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonCaptureActionPerformed"/>
+              </Events>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JToggleButton" name="jToggleButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButtonExitActionPerformed"/>
+      </Events>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="630" y="580" width="60" height="-1"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonDownload">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x4e0b;&#x8f7d;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonDownloadActionPerformed"/>
+      </Events>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="20" y="580" width="90" height="-1"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Component class="javax.swing.JProgressBar" name="jProgressBar">
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="130" y="580" width="410" height="20"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Container class="javax.swing.JPanel" name="jPanelPlayInfo">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder/>
+          </Border>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+          <AbsoluteConstraints x="550" y="390" width="160" height="180"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JTextField" name="jTextFieldPlayTime">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="0" y="0" width="160" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonSave">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x4fdd;&#x5b58;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSaveActionPerformed"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="0" y="140" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JButton" name="jButtonStopSave">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x505c;&#x6b62;"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonStopSaveActionPerformed"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="80" y="140" width="70" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel15">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6587;&#x4ef6;&#x540d;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="30" width="40" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldFileName">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="0" y="50" width="160" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel16">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x603b;&#x5b57;&#x8282;&#x6570;"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="10" y="80" width="-1" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldTotalBytes">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
+              <AbsoluteConstraints x="0" y="100" width="160" height="-1"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

File diff suppressed because it is too large
+ 1144 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBack.java


+ 523 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBackByTime.form

@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" value="&#x6309;&#x65f6;&#x95f4;&#x56de;&#x653e;"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="jPanelPlayControl" min="-2" pref="538" max="-2" attributes="1"/>
+                      <EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jButtonDownload" alignment="0" pref="81" max="32767" attributes="1"/>
+                          <Component id="jButtonSave" alignment="0" pref="81" max="32767" attributes="1"/>
+                          <Component id="jButtonExit" alignment="0" pref="81" max="32767" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <Component id="jPanelTime" alignment="0" min="-2" max="-2" attributes="1"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanelTime" min="-2" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="-2" pref="249" max="-2" attributes="0"/>
+                      <Component id="jButtonDownload" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="30" max="-2" attributes="0"/>
+                      <Component id="jButtonSave" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="80" max="-2" attributes="0"/>
+                      <Component id="jButtonExit" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jPanelPlayControl" min="-2" pref="430" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanelTime">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="&#x5f55;&#x50cf;&#x65f6;&#x95f4;"/>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <Component id="jLabelStartTime" min="-2" pref="60" max="-2" attributes="0"/>
+                          <Component id="jTextFieldsYear" min="-2" pref="40" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel1" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jTextFieldsMonth" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel2" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldsDay" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Group type="102" alignment="0" attributes="0">
+                                  <EmptySpace min="20" pref="20" max="20" attributes="0"/>
+                                  <Component id="jTextFieldsHour" min="-2" pref="30" max="-2" attributes="0"/>
+                              </Group>
+                              <Component id="jLabel3" min="-2" pref="30" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel4" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jTextFieldsMinute" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel5" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jTextFieldsSecond" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel6" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jLabel13" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
+                          <Component id="jTextFieldChanNum" min="-2" pref="54" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jLabelEndTime" min="-2" pref="60" max="-2" attributes="0"/>
+                          <Component id="jTextFieldeYear" min="-2" pref="40" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel7" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jTextFieldeMonth" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel8" min="-2" pref="20" max="-2" attributes="0"/>
+                          <Component id="jTextFieldeDay" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="jLabel9" min="-2" pref="30" max="-2" attributes="0"/>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <EmptySpace min="20" pref="20" max="20" attributes="0"/>
+                                  <Component id="jTextFieldeHour" min="-2" pref="30" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel10" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jTextFieldeMinute" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel11" min="-2" pref="20" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jTextFieldeSecond" min="-2" pref="30" max="-2" attributes="0"/>
+                          <EmptySpace min="10" pref="10" max="10" attributes="0"/>
+                          <Component id="jLabel12" min="-2" pref="30" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace pref="23" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jLabelStartTime" min="-2" pref="20" max="-2" attributes="0"/>
+                      <Component id="jTextFieldsYear" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldsMonth" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldsDay" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldsHour" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel3" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldsMinute" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel5" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldsSecond" min="-2" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="jLabel6" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="jTextFieldChanNum" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="jLabel13" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jLabelEndTime" min="-2" pref="20" max="-2" attributes="0"/>
+                      <Component id="jTextFieldeYear" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel7" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldeMonth" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel8" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldeDay" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel9" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldeHour" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel10" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldeMinute" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel11" min="-2" max="-2" attributes="0"/>
+                      <Component id="jTextFieldeSecond" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel12" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JTextField" name="jTextFieldsHour">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldeHour">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldeYear">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabelEndTime">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x7ed3;&#x675f;&#x65f6;&#x95f4;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5e74;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldsYear">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabelStartTime">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5f00;&#x59cb;&#x65f6;&#x95f4;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65e5;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel6">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x79d2;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldsSecond">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldsDay">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel9">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65e5;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel12">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x79d2;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel8">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6708;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldeSecond">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldsMonth">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldeDay">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldsMinute">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel5">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel11">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5206;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x6708;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel7">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x5e74;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel10">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldeMinute">
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldeMonth">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel4">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x65f6;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel13">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="&#x901a;&#x9053;&#x53f7;"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="jTextFieldChanNum">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="1"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanelPlayControl">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder>
+              <Color PropertyName="color" blue="cc" green="ff" red="cc" type="rgb"/>
+            </TitledBorder>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <Component id="jToolBar1" min="-2" pref="371" max="-2" attributes="0"/>
+                          <EmptySpace min="-2" pref="27" max="-2" attributes="0"/>
+                          <Component id="jSliderAudio" min="-2" pref="107" max="-2" attributes="0"/>
+                      </Group>
+                      <Component id="panelPlay" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Component id="panelPlay" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jSliderAudio" min="-2" max="-2" attributes="0"/>
+                      <Component id="jToolBar1" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="java.awt.Panel" name="panelPlay">
+          <Properties>
+            <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+              <Color blue="ff" green="ff" red="ea" type="rgb"/>
+            </Property>
+          </Properties>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <EmptySpace min="0" pref="520" max="32767" attributes="0"/>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <EmptySpace min="0" pref="378" max="32767" attributes="0"/>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+        </Container>
+        <Component class="javax.swing.JSlider" name="jSliderAudio">
+          <Events>
+            <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jSliderAudioMouseReleased"/>
+          </Events>
+        </Component>
+        <Container class="javax.swing.JToolBar" name="jToolBar1">
+          <Properties>
+            <Property name="rollover" type="boolean" value="true"/>
+          </Properties>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JButton" name="jButtonPlay">
+              <Properties>
+                <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="cc" red="cc" type="rgb"/>
+                </Property>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Play"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonPlayActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonStop">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Stop"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonStopActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel14">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="      "/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonSlow">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Slow"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSlowActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonFast">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Fast"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonFastActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel15">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="         "/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonCapture">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Capture"/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonCaptureActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel16">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="      "/>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JButton" name="jButtonAudio">
+              <Properties>
+                <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                  <Font name="&#x5fae;&#x8f6f;&#x96c5;&#x9ed1;" size="12" style="0"/>
+                </Property>
+                <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                  <Color blue="ff" green="33" red="33" type="rgb"/>
+                </Property>
+                <Property name="text" type="java.lang.String" value="Mute  "/>
+                <Property name="focusable" type="boolean" value="false"/>
+                <Property name="horizontalTextPosition" type="int" value="0"/>
+                <Property name="verticalTextPosition" type="int" value="3"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonAudioActionPerformed"/>
+              </Events>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonDownload">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x4e0b;&#x8f7d;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonDownloadActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonSave">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x4fdd;&#x5b58;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonSaveActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="jButtonExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="&#x9000;&#x51fa;"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonExitActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

+ 907 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogPlayBackByTime.java

@@ -0,0 +1,907 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogPlayBackTime.java
+ *
+ * Created on 2009-11-24, 19:11:16
+ */
+
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+import com.sun.jna.Native;
+import com.sun.jna.NativeLong;
+import com.sun.jna.examples.win32.W32API.HWND;
+import com.sun.jna.ptr.IntByReference;
+
+import javax.swing.*;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/*****************************************************************************
+ *类 :JDialogPlayBackByTime
+ *类描述 :远程按时间回放操作
+ ****************************************************************************/
+public class JDialogPlayBackByTime extends javax.swing.JDialog {
+
+    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
+    NativeLong m_lUserID;//用户ID
+    NativeLong m_lPlayHandle;//播放句柄
+    NativeLong m_lLoadHandle;//下载句柄
+    String m_sDeviceIP;//设备IP
+    int m_iChanShowNum;//回放通道
+    boolean m_bSound;//是否开启声音
+    boolean m_bPause;//是否已暂停
+    boolean m_bTimeSave;//是否在保存
+
+    Timer Downloadtimer;//下载用定时器
+    Timer Playbacktimer;//回放用定时器
+
+
+    /*************************************************
+    函数:      JDialogPlayBackByTime
+    函数描述:  构造函数   Creates new form JDialogPlayBackByTime
+     *************************************************/
+    public JDialogPlayBackByTime(java.awt.Frame parent, boolean modal, NativeLong lUserID, String sIP) {
+        super(parent, modal);
+        initComponents();
+        initialDialog();
+        m_lUserID = lUserID;
+        m_lPlayHandle = new NativeLong(-1);
+        m_lLoadHandle = new NativeLong(-1);
+        m_iChanShowNum = 0;
+        m_sDeviceIP = sIP;
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanelTime = new javax.swing.JPanel();
+        jTextFieldsHour = new javax.swing.JTextField();
+        jTextFieldeHour = new javax.swing.JTextField();
+        jTextFieldeYear = new javax.swing.JTextField();
+        jLabelEndTime = new javax.swing.JLabel();
+        jLabel1 = new javax.swing.JLabel();
+        jTextFieldsYear = new javax.swing.JTextField();
+        jLabelStartTime = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel6 = new javax.swing.JLabel();
+        jTextFieldsSecond = new javax.swing.JTextField();
+        jTextFieldsDay = new javax.swing.JTextField();
+        jLabel9 = new javax.swing.JLabel();
+        jLabel12 = new javax.swing.JLabel();
+        jLabel8 = new javax.swing.JLabel();
+        jTextFieldeSecond = new javax.swing.JTextField();
+        jTextFieldsMonth = new javax.swing.JTextField();
+        jTextFieldeDay = new javax.swing.JTextField();
+        jTextFieldsMinute = new javax.swing.JTextField();
+        jLabel5 = new javax.swing.JLabel();
+        jLabel11 = new javax.swing.JLabel();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel7 = new javax.swing.JLabel();
+        jLabel10 = new javax.swing.JLabel();
+        jTextFieldeMinute = new javax.swing.JTextField();
+        jTextFieldeMonth = new javax.swing.JTextField();
+        jLabel4 = new javax.swing.JLabel();
+        jLabel13 = new javax.swing.JLabel();
+        jTextFieldChanNum = new javax.swing.JTextField();
+        jPanelPlayControl = new javax.swing.JPanel();
+        panelPlay = new java.awt.Panel();
+        jSliderAudio = new javax.swing.JSlider();
+        jToolBar1 = new javax.swing.JToolBar();
+        jButtonPlay = new javax.swing.JButton();
+        jButtonStop = new javax.swing.JButton();
+        jLabel14 = new javax.swing.JLabel();
+        jButtonSlow = new javax.swing.JButton();
+        jButtonFast = new javax.swing.JButton();
+        jLabel15 = new javax.swing.JLabel();
+        jButtonCapture = new javax.swing.JButton();
+        jLabel16 = new javax.swing.JLabel();
+        jButtonAudio = new javax.swing.JButton();
+        jButtonDownload = new javax.swing.JButton();
+        jButtonSave = new javax.swing.JButton();
+        jButtonExit = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("按时间回放");
+
+        jPanelTime.setBorder(javax.swing.BorderFactory.createTitledBorder("录像时间"));
+
+        jLabelEndTime.setText("结束时间");
+
+        jLabel1.setText("年");
+
+        jLabelStartTime.setText("开始时间");
+
+        jLabel3.setText("日");
+
+        jLabel6.setText("秒");
+
+        jLabel9.setText("日");
+
+        jLabel12.setText("秒");
+
+        jLabel8.setText("月");
+
+        jLabel5.setText("分");
+
+        jLabel11.setText("分");
+
+        jLabel2.setText("月");
+
+        jLabel7.setText("年");
+
+        jLabel10.setText("时");
+
+        jLabel4.setText("时");
+
+        jLabel13.setText("通道号");
+
+        jTextFieldChanNum.setText("1");
+
+        javax.swing.GroupLayout jPanelTimeLayout = new javax.swing.GroupLayout(jPanelTime);
+        jPanelTime.setLayout(jPanelTimeLayout);
+        jPanelTimeLayout.setHorizontalGroup(
+            jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelTimeLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanelTimeLayout.createSequentialGroup()
+                        .addComponent(jLabelStartTime, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jTextFieldsYear, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldsMonth, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jTextFieldsDay, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addGroup(jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addGroup(jPanelTimeLayout.createSequentialGroup()
+                                .addGap(20, 20, 20)
+                                .addComponent(jTextFieldsHour, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
+                            .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldsMinute, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldsSecond, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jLabel13)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldChanNum, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(jPanelTimeLayout.createSequentialGroup()
+                        .addComponent(jLabelEndTime, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jTextFieldeYear, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldeMonth, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jTextFieldeDay, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addGroup(jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addGroup(jPanelTimeLayout.createSequentialGroup()
+                                .addGap(20, 20, 20)
+                                .addComponent(jTextFieldeHour, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldeMinute, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel11, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jTextFieldeSecond, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addComponent(jLabel12, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addContainerGap(23, Short.MAX_VALUE))
+        );
+        jPanelTimeLayout.setVerticalGroup(
+            jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelTimeLayout.createSequentialGroup()
+                .addGroup(jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jLabelStartTime, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jTextFieldsYear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel1)
+                    .addComponent(jTextFieldsMonth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel2)
+                    .addComponent(jTextFieldsDay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jTextFieldsHour, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel3)
+                    .addComponent(jLabel4)
+                    .addComponent(jTextFieldsMinute, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel5)
+                    .addComponent(jTextFieldsSecond, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addGroup(jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                        .addComponent(jLabel6)
+                        .addComponent(jTextFieldChanNum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jLabel13)))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanelTimeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jLabelEndTime, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jTextFieldeYear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel7)
+                    .addComponent(jTextFieldeMonth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel8)
+                    .addComponent(jTextFieldeDay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel9)
+                    .addComponent(jTextFieldeHour, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel10)
+                    .addComponent(jTextFieldeMinute, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel11)
+                    .addComponent(jTextFieldeSecond, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel12)))
+        );
+
+        jPanelPlayControl.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("宋体", 0, 12), new java.awt.Color(204, 255, 204))); // NOI18N
+
+        panelPlay.setBackground(new java.awt.Color(234, 255, 255));
+
+        javax.swing.GroupLayout panelPlayLayout = new javax.swing.GroupLayout(panelPlay);
+        panelPlay.setLayout(panelPlayLayout);
+        panelPlayLayout.setHorizontalGroup(
+            panelPlayLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 520, Short.MAX_VALUE)
+        );
+        panelPlayLayout.setVerticalGroup(
+            panelPlayLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 378, Short.MAX_VALUE)
+        );
+
+        jSliderAudio.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseReleased(java.awt.event.MouseEvent evt) {
+                jSliderAudioMouseReleased(evt);
+            }
+        });
+
+        jToolBar1.setRollover(true);
+
+        jButtonPlay.setBackground(new java.awt.Color(204, 204, 255));
+        jButtonPlay.setFont(new java.awt.Font("微软雅黑", 0, 12));
+        jButtonPlay.setForeground(new java.awt.Color(51, 51, 255));
+        jButtonPlay.setText("Play");
+        jButtonPlay.setFocusable(false);
+        jButtonPlay.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        jButtonPlay.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+        jButtonPlay.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonPlayActionPerformed(evt);
+            }
+        });
+        jToolBar1.add(jButtonPlay);
+
+        jButtonStop.setFont(new java.awt.Font("微软雅黑", 0, 12));
+        jButtonStop.setForeground(new java.awt.Color(51, 51, 255));
+        jButtonStop.setText("Stop");
+        jButtonStop.setFocusable(false);
+        jButtonStop.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        jButtonStop.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+        jButtonStop.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonStopActionPerformed(evt);
+            }
+        });
+        jToolBar1.add(jButtonStop);
+
+        jLabel14.setText("      ");
+        jToolBar1.add(jLabel14);
+
+        jButtonSlow.setFont(new java.awt.Font("微软雅黑", 0, 12));
+        jButtonSlow.setForeground(new java.awt.Color(51, 51, 255));
+        jButtonSlow.setText("Slow");
+        jButtonSlow.setFocusable(false);
+        jButtonSlow.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        jButtonSlow.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+        jButtonSlow.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonSlowActionPerformed(evt);
+            }
+        });
+        jToolBar1.add(jButtonSlow);
+
+        jButtonFast.setFont(new java.awt.Font("微软雅黑", 0, 12));
+        jButtonFast.setForeground(new java.awt.Color(51, 51, 255));
+        jButtonFast.setText("Fast");
+        jButtonFast.setFocusable(false);
+        jButtonFast.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        jButtonFast.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+        jButtonFast.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonFastActionPerformed(evt);
+            }
+        });
+        jToolBar1.add(jButtonFast);
+
+        jLabel15.setText("         ");
+        jToolBar1.add(jLabel15);
+
+        jButtonCapture.setFont(new java.awt.Font("微软雅黑", 0, 12));
+        jButtonCapture.setForeground(new java.awt.Color(51, 51, 255));
+        jButtonCapture.setText("Capture");
+        jButtonCapture.setFocusable(false);
+        jButtonCapture.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        jButtonCapture.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+        jButtonCapture.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonCaptureActionPerformed(evt);
+            }
+        });
+        jToolBar1.add(jButtonCapture);
+
+        jLabel16.setText("      ");
+        jToolBar1.add(jLabel16);
+
+        jButtonAudio.setFont(new java.awt.Font("微软雅黑", 0, 12));
+        jButtonAudio.setForeground(new java.awt.Color(51, 51, 255));
+        jButtonAudio.setText("Mute  ");
+        jButtonAudio.setFocusable(false);
+        jButtonAudio.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        jButtonAudio.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+        jButtonAudio.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonAudioActionPerformed(evt);
+            }
+        });
+        jToolBar1.add(jButtonAudio);
+
+        javax.swing.GroupLayout jPanelPlayControlLayout = new javax.swing.GroupLayout(jPanelPlayControl);
+        jPanelPlayControl.setLayout(jPanelPlayControlLayout);
+        jPanelPlayControlLayout.setHorizontalGroup(
+            jPanelPlayControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelPlayControlLayout.createSequentialGroup()
+                .addGroup(jPanelPlayControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanelPlayControlLayout.createSequentialGroup()
+                        .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(27, 27, 27)
+                        .addComponent(jSliderAudio, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addComponent(panelPlay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        jPanelPlayControlLayout.setVerticalGroup(
+            jPanelPlayControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanelPlayControlLayout.createSequentialGroup()
+                .addComponent(panelPlay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGap(11, 11, 11)
+                .addGroup(jPanelPlayControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jSliderAudio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap())
+        );
+
+        jButtonDownload.setText("下载");
+        jButtonDownload.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonDownloadActionPerformed(evt);
+            }
+        });
+
+        jButtonSave.setText("保存");
+        jButtonSave.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonSaveActionPerformed(evt);
+            }
+        });
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(jPanelPlayControl, javax.swing.GroupLayout.PREFERRED_SIZE, 538, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(10, 10, 10)
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(jButtonDownload, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)
+                            .addComponent(jButtonSave, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)
+                            .addComponent(jButtonExit, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)))
+                    .addComponent(jPanelTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jPanelTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(249, 249, 249)
+                        .addComponent(jButtonDownload)
+                        .addGap(30, 30, 30)
+                        .addComponent(jButtonSave)
+                        .addGap(80, 80, 80)
+                        .addComponent(jButtonExit))
+                    .addGroup(layout.createSequentialGroup()
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jPanelPlayControl, javax.swing.GroupLayout.PREFERRED_SIZE, 430, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+ /*************************************************
+    函数:      "退出"  按钮单击相应函数
+    函数描述:  销毁对话框
+*************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonExitActionPerformed
+    {//GEN-HEADEREND:event_jButtonExitActionPerformed
+        StopPlay();
+        dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+
+/*************************************************
+    函数:     "声音进度条"  鼠标离开响应函数
+    函数描述:  调节声音
+ *************************************************/
+    private void jSliderAudioMouseReleased(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jSliderAudioMouseReleased
+    {//GEN-HEADEREND:event_jSliderAudioMouseReleased
+        	if (m_lPlayHandle.intValue() >= 0)
+		{
+			if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYAUDIOVOLUME, jSliderAudio.getValue(), null))
+			{
+				System.out.println(" Set volume Succeed!");
+			}
+			else
+			{
+				System.out.println(" Set volume Failed!");
+			}
+		}
+    }//GEN-LAST:event_jSliderAudioMouseReleased
+
+/*************************************************
+    函数:      "下载"  按钮单击相应函数
+    函数描述:   开始或停止下载文件
+*************************************************/
+    private void jButtonDownloadActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonDownloadActionPerformed
+    {//GEN-HEADEREND:event_jButtonDownloadActionPerformed
+        if (m_lLoadHandle.intValue() == -1)
+        {
+            HCNetSDK.NET_DVR_TIME struStartTime;
+            HCNetSDK.NET_DVR_TIME struStopTime;
+
+            struStartTime = new HCNetSDK.NET_DVR_TIME();
+            struStopTime = new HCNetSDK.NET_DVR_TIME();
+            struStartTime.dwYear = Integer.parseInt(jTextFieldsYear.getText());//开始时间
+            struStartTime.dwMonth = Integer.parseInt(jTextFieldsMonth.getText());
+            struStartTime.dwDay = Integer.parseInt(jTextFieldsDay.getText());
+            struStartTime.dwHour = Integer.parseInt(jTextFieldsHour.getText());
+            struStartTime.dwMinute = Integer.parseInt(jTextFieldsMinute.getText());
+            struStartTime.dwSecond = Integer.parseInt(jTextFieldsSecond.getText());
+            struStopTime.dwYear = Integer.parseInt(jTextFieldeYear.getText());//结束时间
+            struStopTime.dwMonth = Integer.parseInt(jTextFieldeMonth.getText());
+            struStopTime.dwDay = Integer.parseInt(jTextFieldeDay.getText());
+            struStopTime.dwHour = Integer.parseInt(jTextFieldeHour.getText());
+            struStopTime.dwMinute = Integer.parseInt(jTextFieldeMinute.getText());
+            struStopTime.dwSecond = Integer.parseInt(jTextFieldeSecond.getText());
+
+            m_iChanShowNum = Integer.parseInt(jTextFieldChanNum.getText());
+
+            String sFileName = "c:/DownLoad/" + m_sDeviceIP + m_iChanShowNum + struStartTime.toStringTitle() + struStopTime.toStringTitle() + ".mp4";
+            System.out.println(sFileName);
+            m_lLoadHandle = hCNetSDK.NET_DVR_GetFileByTime(m_lUserID, new NativeLong(m_iChanShowNum), struStartTime, struStopTime, sFileName);
+            if (m_lLoadHandle.intValue() >= 0)
+            {
+                hCNetSDK.NET_DVR_PlayBackControl(m_lLoadHandle, HCNetSDK.NET_DVR_PLAYSTART, 0, null);
+                jButtonDownload.setText("停止下载");
+                Downloadtimer = new Timer();//新建定时器
+                Downloadtimer.schedule(new DownloadTask(), 0, 5000);//0秒后开始响应函数
+            } else
+            {
+                JOptionPane.showMessageDialog(this, "按时间下载失败");
+                System.out.println("laste error " + hCNetSDK.NET_DVR_GetLastError());
+                return;
+            }
+        }
+        else
+        {
+            hCNetSDK.NET_DVR_StopGetFile(m_lLoadHandle);
+            jButtonDownload.setText("下载");
+            Downloadtimer.cancel();
+        }
+    }//GEN-LAST:event_jButtonDownloadActionPerformed
+
+/*************************************************
+    函数:      "保存"  按钮单击相应函数
+    函数描述:  开始或停止保存文件
+*************************************************/
+    private void jButtonSaveActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonSaveActionPerformed
+    {//GEN-HEADEREND:event_jButtonSaveActionPerformed
+        if (m_lPlayHandle.intValue() == -1)
+        {
+            JOptionPane.showMessageDialog(this, "请先播放文件");
+            return;
+        }
+        if (!m_bTimeSave)
+        {
+            JFileChooser myJFileChooser = new JFileChooser();
+            myJFileChooser.showSaveDialog(this);
+            String sFileName = myJFileChooser.getSelectedFile() + ".mp4";
+            if (hCNetSDK.NET_DVR_PlayBackSaveData(m_lPlayHandle, sFileName))
+            {
+                m_bTimeSave = true;
+                jButtonSave.setText("停止保存");
+            }
+        } else
+        {
+            hCNetSDK.NET_DVR_StopPlayBackSave(m_lPlayHandle);
+            m_bTimeSave = false;
+            jButtonSave.setText("保存");
+        }
+    }//GEN-LAST:event_jButtonSaveActionPerformed
+
+ /*************************************************
+    函数:      "Play"  按钮单击相应函数
+    函数描述:  开始或暂停按时间回放
+ *************************************************/
+    private void jButtonPlayActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonPlayActionPerformed
+    {//GEN-HEADEREND:event_jButtonPlayActionPerformed
+       HCNetSDK.NET_DVR_TIME struStartTime;
+       HCNetSDK.NET_DVR_TIME struStopTime;
+
+        if (m_lPlayHandle.intValue() == -1)
+        {
+            m_iChanShowNum = Integer.parseInt(jTextFieldChanNum.getText());
+
+            struStartTime = new HCNetSDK.NET_DVR_TIME();
+            struStopTime = new HCNetSDK.NET_DVR_TIME();
+
+            struStartTime.dwYear = Integer.parseInt(jTextFieldsYear.getText());//开始时间
+            struStartTime.dwMonth = Integer.parseInt(jTextFieldsMonth.getText());
+            struStartTime.dwDay = Integer.parseInt(jTextFieldsDay.getText());
+            struStartTime.dwHour = Integer.parseInt(jTextFieldsHour.getText());
+            struStartTime.dwMinute = Integer.parseInt(jTextFieldsMinute.getText());
+            struStartTime.dwSecond = Integer.parseInt(jTextFieldsSecond.getText());
+            struStopTime.dwYear = Integer.parseInt(jTextFieldeYear.getText());//结束时间
+            struStopTime.dwMonth = Integer.parseInt(jTextFieldeMonth.getText());
+            struStopTime.dwDay = Integer.parseInt(jTextFieldeDay.getText());
+            struStopTime.dwHour = Integer.parseInt(jTextFieldeHour.getText());
+            struStopTime.dwMinute = Integer.parseInt(jTextFieldeMinute.getText());
+            struStopTime.dwSecond = Integer.parseInt(jTextFieldeSecond.getText());
+
+            //获取窗口句柄
+            HWND hwnd = new HWND(Native.getComponentPointer(panelPlay));
+
+            m_lPlayHandle = hCNetSDK.NET_DVR_PlayBackByTime(m_lUserID, new NativeLong(m_iChanShowNum), struStartTime, struStopTime, hwnd);
+
+            if (m_lPlayHandle.intValue() == -1)
+            {
+                JOptionPane.showMessageDialog(this, "按时间回放失败");
+                return;
+            }
+            else{
+                //还要调用该接口才能开始回放
+                hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYSTART, 0, null);
+                System.out.println("开始回放");
+            }
+
+            if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYSTARTAUDIO, 0, null))
+            {
+                m_bSound = true;
+                hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYAUDIOVOLUME, (0xffff) / 2, null);
+                System.out.println("开始声音");
+                jSliderAudio.setValue(50);
+                jButtonAudio.setText("Audio");
+            } else
+            {
+                m_bSound = false;
+                jButtonAudio.setText("Mute");
+            }
+
+            //开始计时器
+            Playbacktimer = new Timer();//新建定时器
+            Playbacktimer.schedule(new PlaybackTask(), 0, 5000);//0秒后开始响应函数
+        } else
+        {
+            if (m_bPause)
+            {
+                if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYRESTART, 0, null))
+                {
+                    System.out.println("Start");
+                    jButtonPlay.setText("Pause");
+                    m_bPause = false;
+                }
+            } else
+            {
+                if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYPAUSE, 0, null))
+                {
+                    System.out.println("Pause");
+                    m_bPause = true;
+                    jButtonPlay.setText("Start");
+                }
+            }
+        }
+    }//GEN-LAST:event_jButtonPlayActionPerformed
+
+/*************************************************
+    函数:      "Stop"  按钮单击相应函数
+    函数描述:  停止回放
+ *************************************************/
+    private void jButtonStopActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonStopActionPerformed
+    {//GEN-HEADEREND:event_jButtonStopActionPerformed
+               StopPlay();
+    }//GEN-LAST:event_jButtonStopActionPerformed
+
+/*************************************************
+    函数:      "Slow"  按钮单击相应函数
+    函数描述:  慢放
+ *************************************************/
+    private void jButtonSlowActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonSlowActionPerformed
+    {//GEN-HEADEREND:event_jButtonSlowActionPerformed
+       	hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, hCNetSDK.NET_DVR_PLAYSLOW, 0, null);
+    }//GEN-LAST:event_jButtonSlowActionPerformed
+
+/*************************************************
+    函数:      "Fast"  按钮单击相应函数
+    函数描述:  快放
+ *************************************************/
+    private void jButtonFastActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonFastActionPerformed
+    {//GEN-HEADEREND:event_jButtonFastActionPerformed
+        hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, hCNetSDK.NET_DVR_PLAYFAST, 0, null);
+    }//GEN-LAST:event_jButtonFastActionPerformed
+
+/*************************************************
+    函数:      "Capture"  按钮单击相应函数
+    函数描述:  截图
+*************************************************/
+    private void jButtonCaptureActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonCaptureActionPerformed
+    {//GEN-HEADEREND:event_jButtonCaptureActionPerformed
+        if(m_lPlayHandle.intValue() == -1)
+        {
+            return;
+        }
+        String sPicName = "C:/Picture/" + m_iChanShowNum + System.currentTimeMillis() + ".bmp";
+	if (hCNetSDK.NET_DVR_PlayBackCaptureFile(m_lPlayHandle,sPicName))
+	{
+		System.out.println("抓图:" + sPicName);
+		return;
+	}
+	else
+	{
+		JOptionPane.showMessageDialog(this, "抓图失败");
+	}
+    }//GEN-LAST:event_jButtonCaptureActionPerformed
+
+/*************************************************
+    函数:      "Audio"  按钮单击相应函数
+    函数描述:  开启或关闭声音
+*************************************************/
+    private void jButtonAudioActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonAudioActionPerformed
+    {//GEN-HEADEREND:event_jButtonAudioActionPerformed
+       if (m_lPlayHandle.intValue() >= 0)
+	{
+		if (m_bSound)
+		{
+			if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYSTOPAUDIO, 0, null))
+			{
+				m_bSound = false;
+				jButtonAudio.setText("Mute");
+			}
+			else
+			{
+				System.out.println("Stop audio failed!");
+			}
+		}
+		else
+		{
+			if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYSTARTAUDIO, 0, null))
+			{
+				jButtonAudio.setText("Audio");
+				m_bSound = true;
+			}
+			else
+			{
+				System.out.println("Start audio failed!");
+			}
+		}
+	}
+    }//GEN-LAST:event_jButtonAudioActionPerformed
+
+/*************************************************
+    函数:      initialDialog
+    函数描述:   初始化Dialog
+*************************************************/
+     private void initialDialog()
+     {
+         Date today = new Date();//现在时间,用于设置时间框里的时间(当天的0:0:0-23:59:59)
+         Calendar now = Calendar.getInstance();//日历对象
+         now.setTime(today); //设置时间
+
+         //开始时间
+         jTextFieldsYear.setText(now.get(Calendar.YEAR) + "");
+         jTextFieldsMonth.setText((now.get(Calendar.MONTH) + 1) + "");
+         jTextFieldsDay.setText(1 + "");
+         jTextFieldsHour.setText("0");
+         jTextFieldsMinute.setText("0");
+         jTextFieldsSecond.setText("0");
+
+         //结束时间
+         jTextFieldeYear.setText(now.get(Calendar.YEAR) + "");
+         jTextFieldeMonth.setText((now.get(Calendar.MONTH) + 1) + "");
+         jTextFieldeDay.setText(now.get(Calendar.DATE) + "");
+         jTextFieldeHour.setText("23");
+         jTextFieldeMinute.setText("59");
+         jTextFieldeSecond.setText("59");
+
+         this.addWindowListener(new WindowAdapter()
+         {
+            @Override
+             public void windowClosing(WindowEvent e)
+             {
+                 StopPlay();
+             }
+         });
+     }
+
+/*************************************************
+    类:      DownloadTask
+    类描述:  下载定时器响应函数
+ *************************************************/
+    class DownloadTask extends java.util.TimerTask
+    {
+        //定时器函数
+        @Override
+        public void run()
+        {
+            IntByReference nPos = new IntByReference(0);
+            hCNetSDK.NET_DVR_PlayBackControl(m_lLoadHandle, HCNetSDK.NET_DVR_PLAYGETPOS, 0, nPos);
+            if (nPos.getValue() > 100)
+            {
+                hCNetSDK.NET_DVR_StopGetFile(m_lLoadHandle);
+                m_lLoadHandle.setValue(-1);
+                jButtonDownload.setText("下载");
+                Downloadtimer.cancel();
+                JOptionPane.showMessageDialog(null, "由于网络原因或DVR忙,下载异常终止!");
+            }
+            if (nPos.getValue() == 100)
+            {
+                hCNetSDK.NET_DVR_StopGetFile(m_lLoadHandle);
+                m_lLoadHandle.setValue(-1);
+                jButtonDownload.setText("下载");
+                Downloadtimer.cancel();
+                JOptionPane.showMessageDialog(null, "按时间下载结束!");
+            }
+        }
+    }
+
+/*************************************************
+    类:      PlaybackTask
+    类描述:  下载定时器响应函数
+*************************************************/
+    class PlaybackTask extends java.util.TimerTask
+    {
+        //定时器函数
+        @Override
+        public void run()
+        {
+                IntByReference nPos = new IntByReference(0);
+            	if (m_lPlayHandle.intValue() >= 0)
+		{
+			if (hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYGETPOS, 0, nPos))
+			{
+                            System.out.println("回放进度" + nPos.getValue());
+			}
+			else
+			{
+                             System.out.println("获取回放进度失败");
+			}
+
+			if (nPos.getValue() > 100)
+			{
+				StopPlay();
+				JOptionPane.showMessageDialog(null, "由于网络原因或DVR忙,回放异常终止!");
+			}
+			if (nPos.getValue() == 100)
+			{
+				StopPlay();
+				JOptionPane.showMessageDialog(null, "按时间回放结束");
+			}
+		}
+        }
+    }
+
+/*************************************************
+    函数:      StopPlay
+    函数描述:  停止回放的相关操作
+*************************************************/
+    private void  StopPlay()
+    {
+        if (m_lPlayHandle.intValue() >= 0)
+	{
+		if (m_bTimeSave)
+		{
+			hCNetSDK.NET_DVR_StopPlayBackSave(m_lPlayHandle);
+                        jButtonSave.setText("保存");
+			m_bTimeSave = false;
+		}
+
+		hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYSTOPAUDIO, 0, null);
+		hCNetSDK.NET_DVR_StopPlayBack(m_lPlayHandle);
+		m_lPlayHandle.setValue(-1);
+
+		Playbacktimer.cancel();
+                panelPlay.repaint();
+	}
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonAudio;
+    private javax.swing.JButton jButtonCapture;
+    private javax.swing.JButton jButtonDownload;
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JButton jButtonFast;
+    private javax.swing.JButton jButtonPlay;
+    private javax.swing.JButton jButtonSave;
+    private javax.swing.JButton jButtonSlow;
+    private javax.swing.JButton jButtonStop;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel10;
+    private javax.swing.JLabel jLabel11;
+    private javax.swing.JLabel jLabel12;
+    private javax.swing.JLabel jLabel13;
+    private javax.swing.JLabel jLabel14;
+    private javax.swing.JLabel jLabel15;
+    private javax.swing.JLabel jLabel16;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JLabel jLabel6;
+    private javax.swing.JLabel jLabel7;
+    private javax.swing.JLabel jLabel8;
+    private javax.swing.JLabel jLabel9;
+    private javax.swing.JLabel jLabelEndTime;
+    private javax.swing.JLabel jLabelStartTime;
+    private javax.swing.JPanel jPanelPlayControl;
+    private javax.swing.JPanel jPanelTime;
+    private javax.swing.JSlider jSliderAudio;
+    private javax.swing.JTextField jTextFieldChanNum;
+    private javax.swing.JTextField jTextFieldeDay;
+    private javax.swing.JTextField jTextFieldeHour;
+    private javax.swing.JTextField jTextFieldeMinute;
+    private javax.swing.JTextField jTextFieldeMonth;
+    private javax.swing.JTextField jTextFieldeSecond;
+    private javax.swing.JTextField jTextFieldeYear;
+    private javax.swing.JTextField jTextFieldsDay;
+    private javax.swing.JTextField jTextFieldsHour;
+    private javax.swing.JTextField jTextFieldsMinute;
+    private javax.swing.JTextField jTextFieldsMonth;
+    private javax.swing.JTextField jTextFieldsSecond;
+    private javax.swing.JTextField jTextFieldsYear;
+    private javax.swing.JToolBar jToolBar1;
+    private java.awt.Panel panelPlay;
+    // End of variables declaration//GEN-END:variables
+
+}

File diff suppressed because it is too large
+ 1191 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogRecordSchedule.form


+ 870 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogRecordSchedule.java

@@ -0,0 +1,870 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * JDialogRecordSchedule.java
+ *
+ * Created on 2009-9-21, 10:55:16
+ */
+/**
+ *
+ * @author Administrator
+ */
+
+package com.example.demo.hk.ClientDemo;
+
+/*****************************************************************************
+ *类 :JDialogRecordSchedule
+ *类描述 :定时录像设置
+ ****************************************************************************/
+public class JDialogRecordSchedule extends javax.swing.JDialog
+{
+
+    private HCNetSDK.NET_DVR_RECORD_V30 m_struRemoteRecCfg;//录像参数
+
+    /*************************************************
+    函数:      JDialogRecordSchedule
+    函数描述:	构造函数   Creates new form JDialogRecordSchedule
+     *************************************************/
+    public JDialogRecordSchedule(java.awt.Dialog parent, boolean modal, HCNetSDK.NET_DVR_RECORD_V30 struRemoteRecCfg)
+    {
+        super(parent, modal);
+        m_struRemoteRecCfg = struRemoteRecCfg;
+        initComponents();
+    }
+
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jDialog1 = new javax.swing.JDialog();
+        jLabel1 = new javax.swing.JLabel();
+        jComboBoxWeekDay = new javax.swing.JComboBox();
+        jCheckBoxAllDay = new javax.swing.JCheckBox();
+        jLabel2 = new javax.swing.JLabel();
+        jComboBoxRecordType = new javax.swing.JComboBox();
+        jPanel1 = new javax.swing.JPanel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel4 = new javax.swing.JLabel();
+        jLabel5 = new javax.swing.JLabel();
+        jLabel6 = new javax.swing.JLabel();
+        jTextFieldEndHour1 = new javax.swing.JTextField();
+        jTextFieldBeginMinute1 = new javax.swing.JTextField();
+        jLabel7 = new javax.swing.JLabel();
+        jLabel8 = new javax.swing.JLabel();
+        jTextFieldBeginHour1 = new javax.swing.JTextField();
+        jLabel9 = new javax.swing.JLabel();
+        jTextFieldEndMinute1 = new javax.swing.JTextField();
+        jLabel10 = new javax.swing.JLabel();
+        jLabel11 = new javax.swing.JLabel();
+        jComboBoxRecordType1 = new javax.swing.JComboBox();
+        jLabel12 = new javax.swing.JLabel();
+        jTextFieldBeginHour2 = new javax.swing.JTextField();
+        jLabel13 = new javax.swing.JLabel();
+        jTextFieldBeginMinute2 = new javax.swing.JTextField();
+        jLabel14 = new javax.swing.JLabel();
+        jLabel15 = new javax.swing.JLabel();
+        jTextFieldEndHour2 = new javax.swing.JTextField();
+        jLabel16 = new javax.swing.JLabel();
+        jTextFieldEndMinute2 = new javax.swing.JTextField();
+        jLabel17 = new javax.swing.JLabel();
+        jComboBoxRecordType2 = new javax.swing.JComboBox();
+        jLabel18 = new javax.swing.JLabel();
+        jTextFieldBeginHour3 = new javax.swing.JTextField();
+        jLabel19 = new javax.swing.JLabel();
+        jTextFieldBeginMinute3 = new javax.swing.JTextField();
+        jLabel20 = new javax.swing.JLabel();
+        jLabel21 = new javax.swing.JLabel();
+        jTextFieldEndHour3 = new javax.swing.JTextField();
+        jLabel22 = new javax.swing.JLabel();
+        jTextFieldEndMinute3 = new javax.swing.JTextField();
+        jLabel23 = new javax.swing.JLabel();
+        jComboBoxRecordType3 = new javax.swing.JComboBox();
+        jLabel24 = new javax.swing.JLabel();
+        jTextFieldBeginHour4 = new javax.swing.JTextField();
+        jLabel25 = new javax.swing.JLabel();
+        jTextFieldBeginMinute4 = new javax.swing.JTextField();
+        jLabel26 = new javax.swing.JLabel();
+        jLabel27 = new javax.swing.JLabel();
+        jTextFieldEndHour4 = new javax.swing.JTextField();
+        jLabel28 = new javax.swing.JLabel();
+        jTextFieldEndMinute4 = new javax.swing.JTextField();
+        jLabel29 = new javax.swing.JLabel();
+        jComboBoxRecordType4 = new javax.swing.JComboBox();
+        jLabel30 = new javax.swing.JLabel();
+        jTextFieldBeginHour5 = new javax.swing.JTextField();
+        jLabel31 = new javax.swing.JLabel();
+        jTextFieldBeginMinute5 = new javax.swing.JTextField();
+        jLabel32 = new javax.swing.JLabel();
+        jLabel33 = new javax.swing.JLabel();
+        jTextFieldEndHour5 = new javax.swing.JTextField();
+        jLabel34 = new javax.swing.JLabel();
+        jTextFieldEndMinute5 = new javax.swing.JTextField();
+        jLabel35 = new javax.swing.JLabel();
+        jComboBoxRecordType5 = new javax.swing.JComboBox();
+        jLabel36 = new javax.swing.JLabel();
+        jTextFieldBeginHour6 = new javax.swing.JTextField();
+        jLabel37 = new javax.swing.JLabel();
+        jTextFieldBeginMinute6 = new javax.swing.JTextField();
+        jLabel38 = new javax.swing.JLabel();
+        jLabel39 = new javax.swing.JLabel();
+        jTextFieldEndHour6 = new javax.swing.JTextField();
+        jLabel40 = new javax.swing.JLabel();
+        jTextFieldEndMinute6 = new javax.swing.JTextField();
+        jLabel41 = new javax.swing.JLabel();
+        jComboBoxRecordType6 = new javax.swing.JComboBox();
+        jLabel42 = new javax.swing.JLabel();
+        jTextFieldBeginHour7 = new javax.swing.JTextField();
+        jLabel43 = new javax.swing.JLabel();
+        jTextFieldBeginMinute7 = new javax.swing.JTextField();
+        jLabel44 = new javax.swing.JLabel();
+        jLabel45 = new javax.swing.JLabel();
+        jTextFieldEndHour7 = new javax.swing.JTextField();
+        jLabel46 = new javax.swing.JLabel();
+        jTextFieldEndMinute7 = new javax.swing.JTextField();
+        jLabel47 = new javax.swing.JLabel();
+        jComboBoxRecordType7 = new javax.swing.JComboBox();
+        jLabel48 = new javax.swing.JLabel();
+        jTextFieldBeginHour8 = new javax.swing.JTextField();
+        jLabel49 = new javax.swing.JLabel();
+        jTextFieldBeginMinute8 = new javax.swing.JTextField();
+        jLabel50 = new javax.swing.JLabel();
+        jLabel51 = new javax.swing.JLabel();
+        jTextFieldEndHour8 = new javax.swing.JTextField();
+        jLabel52 = new javax.swing.JLabel();
+        jTextFieldEndMinute8 = new javax.swing.JTextField();
+        jLabel53 = new javax.swing.JLabel();
+        jComboBoxRecordType8 = new javax.swing.JComboBox();
+        jButtonSave = new javax.swing.JButton();
+        jButtonExit = new javax.swing.JButton();
+
+        javax.swing.GroupLayout jDialog1Layout = new javax.swing.GroupLayout(jDialog1.getContentPane());
+        jDialog1.getContentPane().setLayout(jDialog1Layout);
+        jDialog1Layout.setHorizontalGroup(
+            jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 400, Short.MAX_VALUE)
+        );
+        jDialog1Layout.setVerticalGroup(
+            jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 300, Short.MAX_VALUE)
+        );
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle("录像时间");
+        getContentPane().setLayout(null);
+
+        jLabel1.setText("日期");
+        getContentPane().add(jLabel1);
+        jLabel1.setBounds(20, 10, 40, 15);
+
+        jComboBoxWeekDay.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天" }));
+        jComboBoxWeekDay.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jComboBoxWeekDayActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jComboBoxWeekDay);
+        jComboBoxWeekDay.setBounds(70, 10, 70, 21);
+
+        jCheckBoxAllDay.setText("全天");
+        jCheckBoxAllDay.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jCheckBoxAllDayActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jCheckBoxAllDay);
+        jCheckBoxAllDay.setBounds(160, 10, 70, 20);
+
+        jLabel2.setText("录像类型");
+        getContentPane().add(jLabel2);
+        jLabel2.setBounds(240, 10, 70, 15);
+
+        jComboBoxRecordType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        getContentPane().add(jComboBoxRecordType);
+        jComboBoxRecordType.setBounds(360, 10, 90, 21);
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
+        jPanel1.setLayout(null);
+
+        jLabel3.setText("起始时间");
+        jPanel1.add(jLabel3);
+        jLabel3.setBounds(70, 10, 60, 15);
+
+        jLabel4.setText("终止时间");
+        jPanel1.add(jLabel4);
+        jLabel4.setBounds(220, 10, 60, 15);
+
+        jLabel5.setText("录像类型");
+        jPanel1.add(jLabel5);
+        jLabel5.setBounds(350, 10, 70, 15);
+
+        jLabel6.setText("时间段1");
+        jPanel1.add(jLabel6);
+        jLabel6.setBounds(10, 40, 50, 15);
+        jPanel1.add(jTextFieldEndHour1);
+        jTextFieldEndHour1.setBounds(220, 40, 30, 21);
+        jPanel1.add(jTextFieldBeginMinute1);
+        jTextFieldBeginMinute1.setBounds(120, 40, 30, 21);
+
+        jLabel7.setText("时");
+        jPanel1.add(jLabel7);
+        jLabel7.setBounds(100, 40, 20, 15);
+
+        jLabel8.setText("分");
+        jPanel1.add(jLabel8);
+        jLabel8.setBounds(320, 40, 20, 15);
+        jPanel1.add(jTextFieldBeginHour1);
+        jTextFieldBeginHour1.setBounds(60, 40, 30, 20);
+
+        jLabel9.setText("时");
+        jPanel1.add(jLabel9);
+        jLabel9.setBounds(260, 40, 20, 15);
+        jPanel1.add(jTextFieldEndMinute1);
+        jTextFieldEndMinute1.setBounds(280, 40, 30, 21);
+
+        jLabel10.setText("分");
+        jPanel1.add(jLabel10);
+        jLabel10.setBounds(160, 40, 20, 15);
+
+        jLabel11.setText("到");
+        jPanel1.add(jLabel11);
+        jLabel11.setBounds(190, 40, 30, 15);
+
+        jComboBoxRecordType1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType1);
+        jComboBoxRecordType1.setBounds(350, 40, 90, 21);
+
+        jLabel12.setText("时间段2");
+        jPanel1.add(jLabel12);
+        jLabel12.setBounds(10, 70, 50, 15);
+        jPanel1.add(jTextFieldBeginHour2);
+        jTextFieldBeginHour2.setBounds(60, 70, 30, 20);
+
+        jLabel13.setText("时");
+        jPanel1.add(jLabel13);
+        jLabel13.setBounds(100, 70, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute2);
+        jTextFieldBeginMinute2.setBounds(120, 70, 30, 21);
+
+        jLabel14.setText("分");
+        jPanel1.add(jLabel14);
+        jLabel14.setBounds(160, 70, 20, 15);
+
+        jLabel15.setText("到");
+        jPanel1.add(jLabel15);
+        jLabel15.setBounds(190, 70, 20, 15);
+        jPanel1.add(jTextFieldEndHour2);
+        jTextFieldEndHour2.setBounds(220, 70, 30, 21);
+
+        jLabel16.setText("时");
+        jPanel1.add(jLabel16);
+        jLabel16.setBounds(260, 70, 20, 15);
+        jPanel1.add(jTextFieldEndMinute2);
+        jTextFieldEndMinute2.setBounds(280, 70, 30, 21);
+
+        jLabel17.setText("分");
+        jPanel1.add(jLabel17);
+        jLabel17.setBounds(320, 70, 20, 15);
+
+        jComboBoxRecordType2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType2);
+        jComboBoxRecordType2.setBounds(350, 70, 90, 21);
+
+        jLabel18.setText("时间段3");
+        jPanel1.add(jLabel18);
+        jLabel18.setBounds(10, 100, 50, 15);
+        jPanel1.add(jTextFieldBeginHour3);
+        jTextFieldBeginHour3.setBounds(60, 100, 30, 20);
+
+        jLabel19.setText("时");
+        jPanel1.add(jLabel19);
+        jLabel19.setBounds(100, 100, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute3);
+        jTextFieldBeginMinute3.setBounds(120, 100, 30, 21);
+
+        jLabel20.setText("分");
+        jPanel1.add(jLabel20);
+        jLabel20.setBounds(160, 100, 20, 15);
+
+        jLabel21.setText("到");
+        jPanel1.add(jLabel21);
+        jLabel21.setBounds(190, 100, 20, 15);
+        jPanel1.add(jTextFieldEndHour3);
+        jTextFieldEndHour3.setBounds(220, 100, 30, 21);
+
+        jLabel22.setText("时");
+        jPanel1.add(jLabel22);
+        jLabel22.setBounds(260, 100, 20, 15);
+        jPanel1.add(jTextFieldEndMinute3);
+        jTextFieldEndMinute3.setBounds(280, 100, 30, 21);
+
+        jLabel23.setText("分");
+        jPanel1.add(jLabel23);
+        jLabel23.setBounds(320, 100, 20, 15);
+
+        jComboBoxRecordType3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType3);
+        jComboBoxRecordType3.setBounds(350, 100, 90, 21);
+
+        jLabel24.setText("时间段4");
+        jPanel1.add(jLabel24);
+        jLabel24.setBounds(10, 130, 50, 15);
+        jPanel1.add(jTextFieldBeginHour4);
+        jTextFieldBeginHour4.setBounds(60, 130, 30, 20);
+
+        jLabel25.setText("时");
+        jPanel1.add(jLabel25);
+        jLabel25.setBounds(100, 130, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute4);
+        jTextFieldBeginMinute4.setBounds(120, 130, 30, 21);
+
+        jLabel26.setText("分");
+        jPanel1.add(jLabel26);
+        jLabel26.setBounds(160, 130, 20, 15);
+
+        jLabel27.setText("到");
+        jPanel1.add(jLabel27);
+        jLabel27.setBounds(190, 130, 20, 15);
+        jPanel1.add(jTextFieldEndHour4);
+        jTextFieldEndHour4.setBounds(220, 130, 30, 21);
+
+        jLabel28.setText("时");
+        jPanel1.add(jLabel28);
+        jLabel28.setBounds(260, 130, 20, 15);
+        jPanel1.add(jTextFieldEndMinute4);
+        jTextFieldEndMinute4.setBounds(280, 130, 30, 21);
+
+        jLabel29.setText("分");
+        jPanel1.add(jLabel29);
+        jLabel29.setBounds(320, 130, 20, 15);
+
+        jComboBoxRecordType4.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType4);
+        jComboBoxRecordType4.setBounds(350, 130, 90, 21);
+
+        jLabel30.setText("时间段5");
+        jPanel1.add(jLabel30);
+        jLabel30.setBounds(10, 160, 50, 15);
+        jPanel1.add(jTextFieldBeginHour5);
+        jTextFieldBeginHour5.setBounds(60, 160, 30, 20);
+
+        jLabel31.setText("时");
+        jPanel1.add(jLabel31);
+        jLabel31.setBounds(100, 160, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute5);
+        jTextFieldBeginMinute5.setBounds(120, 160, 30, 21);
+
+        jLabel32.setText("分");
+        jPanel1.add(jLabel32);
+        jLabel32.setBounds(160, 160, 20, 15);
+
+        jLabel33.setText("到");
+        jPanel1.add(jLabel33);
+        jLabel33.setBounds(190, 160, 20, 15);
+        jPanel1.add(jTextFieldEndHour5);
+        jTextFieldEndHour5.setBounds(220, 160, 30, 21);
+
+        jLabel34.setText("时");
+        jPanel1.add(jLabel34);
+        jLabel34.setBounds(260, 160, 20, 15);
+        jPanel1.add(jTextFieldEndMinute5);
+        jTextFieldEndMinute5.setBounds(280, 160, 30, 21);
+
+        jLabel35.setText("分");
+        jPanel1.add(jLabel35);
+        jLabel35.setBounds(320, 160, 20, 15);
+
+        jComboBoxRecordType5.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType5);
+        jComboBoxRecordType5.setBounds(350, 160, 90, 21);
+
+        jLabel36.setText("时间段6");
+        jPanel1.add(jLabel36);
+        jLabel36.setBounds(10, 190, 50, 15);
+        jPanel1.add(jTextFieldBeginHour6);
+        jTextFieldBeginHour6.setBounds(60, 190, 30, 20);
+
+        jLabel37.setText("时");
+        jPanel1.add(jLabel37);
+        jLabel37.setBounds(100, 190, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute6);
+        jTextFieldBeginMinute6.setBounds(120, 190, 30, 21);
+
+        jLabel38.setText("分");
+        jPanel1.add(jLabel38);
+        jLabel38.setBounds(160, 190, 20, 15);
+
+        jLabel39.setText("到");
+        jPanel1.add(jLabel39);
+        jLabel39.setBounds(190, 190, 20, 15);
+        jPanel1.add(jTextFieldEndHour6);
+        jTextFieldEndHour6.setBounds(220, 190, 30, 21);
+
+        jLabel40.setText("时");
+        jPanel1.add(jLabel40);
+        jLabel40.setBounds(260, 190, 20, 15);
+        jPanel1.add(jTextFieldEndMinute6);
+        jTextFieldEndMinute6.setBounds(280, 190, 30, 21);
+
+        jLabel41.setText("分");
+        jPanel1.add(jLabel41);
+        jLabel41.setBounds(320, 190, 20, 15);
+
+        jComboBoxRecordType6.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType6);
+        jComboBoxRecordType6.setBounds(350, 190, 90, 21);
+
+        jLabel42.setText("时间段7");
+        jPanel1.add(jLabel42);
+        jLabel42.setBounds(10, 220, 50, 15);
+        jPanel1.add(jTextFieldBeginHour7);
+        jTextFieldBeginHour7.setBounds(60, 220, 30, 20);
+
+        jLabel43.setText("时");
+        jPanel1.add(jLabel43);
+        jLabel43.setBounds(100, 220, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute7);
+        jTextFieldBeginMinute7.setBounds(120, 220, 30, 21);
+
+        jLabel44.setText("分");
+        jPanel1.add(jLabel44);
+        jLabel44.setBounds(160, 220, 20, 15);
+
+        jLabel45.setText("到");
+        jPanel1.add(jLabel45);
+        jLabel45.setBounds(190, 220, 20, 15);
+        jPanel1.add(jTextFieldEndHour7);
+        jTextFieldEndHour7.setBounds(220, 220, 30, 21);
+
+        jLabel46.setText("时");
+        jPanel1.add(jLabel46);
+        jLabel46.setBounds(260, 220, 20, 15);
+        jPanel1.add(jTextFieldEndMinute7);
+        jTextFieldEndMinute7.setBounds(280, 220, 30, 21);
+
+        jLabel47.setText("分");
+        jPanel1.add(jLabel47);
+        jLabel47.setBounds(320, 220, 20, 15);
+
+        jComboBoxRecordType7.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType7);
+        jComboBoxRecordType7.setBounds(350, 220, 90, 21);
+
+        jLabel48.setText("时间段8");
+        jPanel1.add(jLabel48);
+        jLabel48.setBounds(10, 250, 50, 15);
+        jPanel1.add(jTextFieldBeginHour8);
+        jTextFieldBeginHour8.setBounds(60, 250, 30, 20);
+
+        jLabel49.setText("时");
+        jPanel1.add(jLabel49);
+        jLabel49.setBounds(100, 250, 20, 15);
+        jPanel1.add(jTextFieldBeginMinute8);
+        jTextFieldBeginMinute8.setBounds(120, 250, 30, 21);
+
+        jLabel50.setText("分");
+        jPanel1.add(jLabel50);
+        jLabel50.setBounds(160, 250, 20, 15);
+
+        jLabel51.setText("到");
+        jPanel1.add(jLabel51);
+        jLabel51.setBounds(190, 250, 30, 15);
+        jPanel1.add(jTextFieldEndHour8);
+        jTextFieldEndHour8.setBounds(220, 250, 30, 21);
+
+        jLabel52.setText("时");
+        jPanel1.add(jLabel52);
+        jLabel52.setBounds(260, 250, 20, 15);
+        jPanel1.add(jTextFieldEndMinute8);
+        jTextFieldEndMinute8.setBounds(280, 250, 30, 21);
+
+        jLabel53.setText("分");
+        jPanel1.add(jLabel53);
+        jLabel53.setBounds(320, 250, 20, 15);
+
+        jComboBoxRecordType8.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "定时录像", "移动侦测", "报警录像", "动测|报警", "动测&报警", "命令触发", "智能录像" }));
+        jPanel1.add(jComboBoxRecordType8);
+        jComboBoxRecordType8.setBounds(350, 250, 90, 21);
+
+        jButtonSave.setText("保存");
+        jButtonSave.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonSaveActionPerformed(evt);
+            }
+        });
+        jPanel1.add(jButtonSave);
+        jButtonSave.setBounds(10, 280, 70, 23);
+
+        getContentPane().add(jPanel1);
+        jPanel1.setBounds(10, 40, 460, 310);
+
+        jButtonExit.setText("退出");
+        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonExitActionPerformed(evt);
+            }
+        });
+        getContentPane().add(jButtonExit);
+        jButtonExit.setBounds(20, 360, 70, 23);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    /*************************************************
+    函数:      日期 组合框选项改变响应函数
+    函数描述:	显示对应日期的参数
+     *************************************************/
+    private void jComboBoxWeekDayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBoxWeekDayActionPerformed
+        showRecordSchedule();
+        setEnable();
+    }//GEN-LAST:event_jComboBoxWeekDayActionPerformed
+
+    /*************************************************
+    函数:      "全天"  单选按钮状态改变响应函数
+    函数描述:	设置控件的 enable 属性
+     *************************************************/
+    private void jCheckBoxAllDayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxAllDayActionPerformed
+        setEnable();
+    }//GEN-LAST:event_jCheckBoxAllDayActionPerformed
+
+    /*************************************************
+    函数:      "保存"  按钮单击响应函数
+    函数描述:	保存设置至结构体
+     *************************************************/
+    private void jButtonSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSaveActionPerformed
+        int iDay = jComboBoxWeekDay.getSelectedIndex();
+        if (jCheckBoxAllDay.isSelected() == true)
+        {
+            m_struRemoteRecCfg.struRecAllDay[iDay].wAllDayRecord = 1;
+            m_struRemoteRecCfg.struRecAllDay[iDay].byRecordType = (byte) this.jComboBoxRecordType.getSelectedIndex();
+        } else
+        {
+            m_struRemoteRecCfg.struRecAllDay[iDay].wAllDayRecord = 0;
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour1.getText());
+
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour2.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour3.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour4.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour5.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour6.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour7.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStartHour = (byte) Integer.parseInt(jTextFieldBeginHour8.getText());
+
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute1.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute2.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute3.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute4.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute5.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute6.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute7.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStartMin = (byte) Integer.parseInt(jTextFieldBeginMinute8.getText());
+
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour1.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour2.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour3.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour4.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour5.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour6.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour7.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStopHour = (byte) Integer.parseInt(jTextFieldEndHour8.getText());
+
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute1.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute2.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute3.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute4.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute5.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute6.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute7.getText());
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStopMin = (byte) Integer.parseInt(jTextFieldEndMinute8.getText());
+
+
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].byRecordType = (byte) jComboBoxRecordType1.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].byRecordType = (byte) jComboBoxRecordType2.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].byRecordType = (byte) jComboBoxRecordType3.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].byRecordType = (byte) jComboBoxRecordType4.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].byRecordType = (byte) jComboBoxRecordType5.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].byRecordType = (byte) jComboBoxRecordType6.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].byRecordType = (byte) jComboBoxRecordType7.getSelectedIndex();
+            m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].byRecordType = (byte) jComboBoxRecordType8.getSelectedIndex();
+        }
+    }//GEN-LAST:event_jButtonSaveActionPerformed
+
+    /*************************************************
+    函数:     "退出"  按钮单击相应函数
+    函数描述:	销毁窗口
+     *************************************************/
+    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
+        this.dispose();
+    }//GEN-LAST:event_jButtonExitActionPerformed
+
+    /*************************************************
+    函数:     showRecordSchedule
+    函数描述:	显示录像时间参数
+     *************************************************/
+    void showRecordSchedule()
+    {
+        int iDay = this.jComboBoxWeekDay.getSelectedIndex();
+        if (m_struRemoteRecCfg.struRecAllDay[iDay].wAllDayRecord == 0)//不全天录像
+        {
+            this.jCheckBoxAllDay.setSelected(false);
+            this.jComboBoxRecordType.setSelectedIndex(m_struRemoteRecCfg.struRecAllDay[iDay].byRecordType);
+        } else
+        {
+            this.jCheckBoxAllDay.setSelected(true);
+            this.jComboBoxRecordType.setSelectedIndex(m_struRemoteRecCfg.struRecAllDay[iDay].byRecordType);
+        }
+        this.jTextFieldBeginHour1.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour2.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour3.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour4.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour5.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour6.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour7.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStartHour + "");
+        this.jTextFieldBeginHour8.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStartHour + "");
+
+        this.jTextFieldBeginMinute1.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute2.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute3.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute4.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute5.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute6.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute7.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStartMin + "");
+        this.jTextFieldBeginMinute8.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStartMin + "");
+
+        this.jTextFieldEndHour1.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour2.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour3.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour4.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour5.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour6.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour7.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStopHour + "");
+        this.jTextFieldEndHour8.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStopHour + "");
+
+        this.jTextFieldEndMinute1.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute2.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute3.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute4.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute5.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute6.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute7.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].struRecordTime.byStopMin + "");
+        this.jTextFieldEndMinute8.setText(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].struRecordTime.byStopMin + "");
+
+        this.jComboBoxRecordType1.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[0].byRecordType);
+        this.jComboBoxRecordType2.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[1].byRecordType);
+        this.jComboBoxRecordType3.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[2].byRecordType);
+        this.jComboBoxRecordType4.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[3].byRecordType);
+        this.jComboBoxRecordType5.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[4].byRecordType);
+        this.jComboBoxRecordType6.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[5].byRecordType);
+        this.jComboBoxRecordType7.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[6].byRecordType);
+        this.jComboBoxRecordType8.setSelectedIndex(m_struRemoteRecCfg.struRecordSched[iDay].struRecordSched[7].byRecordType);
+    }
+
+    /*************************************************
+    函数:     setEnable
+    函数描述:	设置控件 enable 属性
+     *************************************************/
+    private void setEnable()
+    {
+        if (jCheckBoxAllDay.isSelected())
+        {
+            this.jTextFieldBeginHour1.setEnabled(false);
+            this.jTextFieldBeginHour2.setEnabled(false);
+            this.jTextFieldBeginHour3.setEnabled(false);
+            this.jTextFieldBeginHour4.setEnabled(false);
+            this.jTextFieldBeginHour5.setEnabled(false);
+            this.jTextFieldBeginHour6.setEnabled(false);
+            this.jTextFieldBeginHour7.setEnabled(false);
+            this.jTextFieldBeginHour8.setEnabled(false);
+
+            this.jTextFieldBeginMinute1.setEnabled(false);
+            this.jTextFieldBeginMinute2.setEnabled(false);
+            this.jTextFieldBeginMinute3.setEnabled(false);
+            this.jTextFieldBeginMinute4.setEnabled(false);
+            this.jTextFieldBeginMinute5.setEnabled(false);
+            this.jTextFieldBeginMinute6.setEnabled(false);
+            this.jTextFieldBeginMinute7.setEnabled(false);
+            this.jTextFieldBeginMinute8.setEnabled(false);
+
+            this.jTextFieldEndHour1.setEnabled(false);
+            this.jTextFieldEndHour2.setEnabled(false);
+            this.jTextFieldEndHour3.setEnabled(false);
+            this.jTextFieldEndHour4.setEnabled(false);
+            this.jTextFieldEndHour5.setEnabled(false);
+            this.jTextFieldEndHour6.setEnabled(false);
+            this.jTextFieldEndHour7.setEnabled(false);
+            this.jTextFieldEndHour8.setEnabled(false);
+
+            this.jTextFieldEndMinute1.setEnabled(false);
+            this.jTextFieldEndMinute2.setEnabled(false);
+            this.jTextFieldEndMinute3.setEnabled(false);
+            this.jTextFieldEndMinute4.setEnabled(false);
+            this.jTextFieldEndMinute5.setEnabled(false);
+            this.jTextFieldEndMinute6.setEnabled(false);
+            this.jTextFieldEndMinute7.setEnabled(false);
+            this.jTextFieldEndMinute8.setEnabled(false);
+
+            this.jComboBoxRecordType1.setEnabled(false);
+            this.jComboBoxRecordType2.setEnabled(false);
+            this.jComboBoxRecordType3.setEnabled(false);
+            this.jComboBoxRecordType4.setEnabled(false);
+            this.jComboBoxRecordType5.setEnabled(false);
+            this.jComboBoxRecordType6.setEnabled(false);
+            this.jComboBoxRecordType7.setEnabled(false);
+            this.jComboBoxRecordType8.setEnabled(false);
+
+            this.jComboBoxRecordType.setEnabled(true);
+        } else
+        {
+            this.jTextFieldBeginHour1.setEnabled(true);
+            this.jTextFieldBeginHour2.setEnabled(true);
+            this.jTextFieldBeginHour3.setEnabled(true);
+            this.jTextFieldBeginHour4.setEnabled(true);
+            this.jTextFieldBeginHour5.setEnabled(true);
+            this.jTextFieldBeginHour6.setEnabled(true);
+            this.jTextFieldBeginHour7.setEnabled(true);
+            this.jTextFieldBeginHour8.setEnabled(true);
+
+            this.jTextFieldBeginMinute1.setEnabled(true);
+            this.jTextFieldBeginMinute2.setEnabled(true);
+            this.jTextFieldBeginMinute3.setEnabled(true);
+            this.jTextFieldBeginMinute4.setEnabled(true);
+            this.jTextFieldBeginMinute5.setEnabled(true);
+            this.jTextFieldBeginMinute6.setEnabled(true);
+            this.jTextFieldBeginMinute7.setEnabled(true);
+            this.jTextFieldBeginMinute8.setEnabled(true);
+
+            this.jTextFieldEndHour1.setEnabled(true);
+            this.jTextFieldEndHour2.setEnabled(true);
+            this.jTextFieldEndHour3.setEnabled(true);
+            this.jTextFieldEndHour4.setEnabled(true);
+            this.jTextFieldEndHour5.setEnabled(true);
+            this.jTextFieldEndHour6.setEnabled(true);
+            this.jTextFieldEndHour7.setEnabled(true);
+            this.jTextFieldEndHour8.setEnabled(true);
+
+            this.jTextFieldEndMinute1.setEnabled(true);
+            this.jTextFieldEndMinute2.setEnabled(true);
+            this.jTextFieldEndMinute3.setEnabled(true);
+            this.jTextFieldEndMinute4.setEnabled(true);
+            this.jTextFieldEndMinute5.setEnabled(true);
+            this.jTextFieldEndMinute6.setEnabled(true);
+            this.jTextFieldEndMinute7.setEnabled(true);
+            this.jTextFieldEndMinute8.setEnabled(true);
+
+            this.jComboBoxRecordType1.setEnabled(true);
+            this.jComboBoxRecordType2.setEnabled(true);
+            this.jComboBoxRecordType3.setEnabled(true);
+            this.jComboBoxRecordType4.setEnabled(true);
+            this.jComboBoxRecordType5.setEnabled(true);
+            this.jComboBoxRecordType6.setEnabled(true);
+            this.jComboBoxRecordType7.setEnabled(true);
+            this.jComboBoxRecordType8.setEnabled(true);
+
+            this.jComboBoxRecordType.setEnabled(false);
+        }
+    }
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButtonExit;
+    private javax.swing.JButton jButtonSave;
+    javax.swing.JCheckBox jCheckBoxAllDay;
+    javax.swing.JComboBox jComboBoxRecordType;
+    javax.swing.JComboBox jComboBoxRecordType1;
+    javax.swing.JComboBox jComboBoxRecordType2;
+    javax.swing.JComboBox jComboBoxRecordType3;
+    javax.swing.JComboBox jComboBoxRecordType4;
+    javax.swing.JComboBox jComboBoxRecordType5;
+    javax.swing.JComboBox jComboBoxRecordType6;
+    javax.swing.JComboBox jComboBoxRecordType7;
+    javax.swing.JComboBox jComboBoxRecordType8;
+    javax.swing.JComboBox jComboBoxWeekDay;
+    private javax.swing.JDialog jDialog1;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel10;
+    private javax.swing.JLabel jLabel11;
+    private javax.swing.JLabel jLabel12;
+    private javax.swing.JLabel jLabel13;
+    private javax.swing.JLabel jLabel14;
+    private javax.swing.JLabel jLabel15;
+    private javax.swing.JLabel jLabel16;
+    private javax.swing.JLabel jLabel17;
+    private javax.swing.JLabel jLabel18;
+    private javax.swing.JLabel jLabel19;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel20;
+    private javax.swing.JLabel jLabel21;
+    private javax.swing.JLabel jLabel22;
+    private javax.swing.JLabel jLabel23;
+    private javax.swing.JLabel jLabel24;
+    private javax.swing.JLabel jLabel25;
+    private javax.swing.JLabel jLabel26;
+    private javax.swing.JLabel jLabel27;
+    private javax.swing.JLabel jLabel28;
+    private javax.swing.JLabel jLabel29;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel30;
+    private javax.swing.JLabel jLabel31;
+    private javax.swing.JLabel jLabel32;
+    private javax.swing.JLabel jLabel33;
+    private javax.swing.JLabel jLabel34;
+    private javax.swing.JLabel jLabel35;
+    private javax.swing.JLabel jLabel36;
+    private javax.swing.JLabel jLabel37;
+    private javax.swing.JLabel jLabel38;
+    private javax.swing.JLabel jLabel39;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel40;
+    private javax.swing.JLabel jLabel41;
+    private javax.swing.JLabel jLabel42;
+    private javax.swing.JLabel jLabel43;
+    private javax.swing.JLabel jLabel44;
+    private javax.swing.JLabel jLabel45;
+    private javax.swing.JLabel jLabel46;
+    private javax.swing.JLabel jLabel47;
+    private javax.swing.JLabel jLabel48;
+    private javax.swing.JLabel jLabel49;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JLabel jLabel50;
+    private javax.swing.JLabel jLabel51;
+    private javax.swing.JLabel jLabel52;
+    private javax.swing.JLabel jLabel53;
+    private javax.swing.JLabel jLabel6;
+    private javax.swing.JLabel jLabel7;
+    private javax.swing.JLabel jLabel8;
+    private javax.swing.JLabel jLabel9;
+    private javax.swing.JPanel jPanel1;
+    javax.swing.JTextField jTextFieldBeginHour1;
+    javax.swing.JTextField jTextFieldBeginHour2;
+    javax.swing.JTextField jTextFieldBeginHour3;
+    javax.swing.JTextField jTextFieldBeginHour4;
+    javax.swing.JTextField jTextFieldBeginHour5;
+    javax.swing.JTextField jTextFieldBeginHour6;
+    javax.swing.JTextField jTextFieldBeginHour7;
+    javax.swing.JTextField jTextFieldBeginHour8;
+    javax.swing.JTextField jTextFieldBeginMinute1;
+    javax.swing.JTextField jTextFieldBeginMinute2;
+    javax.swing.JTextField jTextFieldBeginMinute3;
+    javax.swing.JTextField jTextFieldBeginMinute4;
+    javax.swing.JTextField jTextFieldBeginMinute5;
+    javax.swing.JTextField jTextFieldBeginMinute6;
+    javax.swing.JTextField jTextFieldBeginMinute7;
+    javax.swing.JTextField jTextFieldBeginMinute8;
+    javax.swing.JTextField jTextFieldEndHour1;
+    javax.swing.JTextField jTextFieldEndHour2;
+    javax.swing.JTextField jTextFieldEndHour3;
+    javax.swing.JTextField jTextFieldEndHour4;
+    javax.swing.JTextField jTextFieldEndHour5;
+    javax.swing.JTextField jTextFieldEndHour6;
+    javax.swing.JTextField jTextFieldEndHour7;
+    javax.swing.JTextField jTextFieldEndHour8;
+    javax.swing.JTextField jTextFieldEndMinute1;
+    javax.swing.JTextField jTextFieldEndMinute2;
+    javax.swing.JTextField jTextFieldEndMinute3;
+    javax.swing.JTextField jTextFieldEndMinute4;
+    javax.swing.JTextField jTextFieldEndMinute5;
+    javax.swing.JTextField jTextFieldEndMinute6;
+    javax.swing.JTextField jTextFieldEndMinute7;
+    javax.swing.JTextField jTextFieldEndMinute8;
+    // End of variables declaration//GEN-END:variables
+}

File diff suppressed because it is too large
+ 1061 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogSerialCfg.form


+ 0 - 0
src/main/java/com/example/demo/hk/ClientDemo/JDialogSerialCfg.java


Some files were not shown because too many files changed in this diff